能否将DataSet中的现存数据转换成Insert语句?

lunix_ly 2003-10-16 10:50:46
能否将DataSet中的现存数据转换成Insert语句?如果能,该怎样实现呢?
...全文
113 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqzhangq 2003-10-17
  • 打赏
  • 举报
回复
用CommandBuilder 和 DataAdapter 是可以的。需要要处理行状态。
给你另外一种方法,就是直接拼Sql语句。写了段通用的代码:
/// <summary>
/// 根据DataTable构建插入的Sql语句
/// </summary>
/// <param name="table"></param>
/// <returns></returns>
public static string GetInsertSQL(DataTable table)
{
string sqlstr = "";
foreach(DataRow row in table.Rows)
{
sqlstr += "insert into " + table.TableName + "(";
foreach(DataColumn col1 in table.Columns)
{
sqlstr += col1.ColumnName + ",";
}
sqlstr = sqlstr.Substring(0,sqlstr.Length - 1) + ") values (";
string tempsql = "";
string tempsql1 = "";
foreach(DataColumn col in table.Columns)
{
tempsql1 = GetValueSQL(row, col);
if (tempsql1.Length > 0)
{
if (tempsql.Length > 0) tempsql += ",";
tempsql += tempsql1;
}

}
if (tempsql.Length == 0) continue;
sqlstr += tempsql + ")";
}
return sqlstr;
}
storm97 2003-10-17
  • 打赏
  • 举报
回复
你的数据库的现存数据如果是从DataAdapter来得,那么你可以在查询前定义一个CommandBuilder,然后指定其查询语句,用DataAdapter来执行查询,把数据填充入DataSet;然后这个CommandBuilder会自动根据查询数据库时访问到的表结构自动生成这个DataAdapter的Update和Delete、Insert命令。

对于在运行时动态指定 SelectCommand(例如通过采用用户提供的文本命令的查询工具)的情况,可能无法在设计时指定合适的 InsertCommand、UpdateCommand 或 DeleteCommand。如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。

使用 CommandBuilder 自动生成 SQL 语句
若要为 DataAdapter 自动生成 SQL 语句,请首先设置 DataAdapter 的 SelectCommand 属性。然后,创建一个 CommandBuilder 对象并以参数形式指定 CommandBuilder 将为其自动生成 SQL 语句的 DataAdapter。

[C#]
SqlDataAdapter custDA = new SqlDataAdapter("SELECT * FROM Customers", nwindConn);
SqlCommandBuilder custCB = new SqlCommandBuilder(custDA);
custCB.QuotePrefix = "[";
custCB.QuoteSuffix = "]";

DataSet custDS = new DataSet();

nwindConn.Open();
custDA.Fill(custDS, "Customers");

// Code to modify data in the DataSet here.

// Without the SqlCommandBuilder, this line would fail.
custDA.Update(custDS, "Customers");
nwindConn.Close();


生成语句后你可以访问DataAdapter的InsertCommand属性来得到生成的语句。

为了自动生成命令,必须设置 SelectCommand 属性,这是最低的要求。SelectCommand 所检索的表架构确定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。

为了返回构造插入、更新和删除命令所必需的元数据,CommandBuilder 必须执行 SelectCommand。因此,必须额外经历一次到数据源的行程,这可能会降低性能。若要实现最佳性能,请显式指定命令而不是使用 CommandBuilder。

SelectCommand 还必须返回至少一个主键或唯一列。如果不存在任何主键或唯一列,则将生成 InvalidOperation 异常,并且不会生成命令。

当与 DataAdapter 关联时,CommandBuilder 将自动生成 DataAdapter 的 InsertCommand、UpdateCommand 和 DeleteCommand 属性(如果它们是空引用)。如果已存在用于某属性的 Command,则将使用现有 Command。

通过联接两个或更多个表来创建的数据库视图不会被视为单个数据库表。在这种情况下,将无法使用 CommandBuilder 来自动生成命令,而需要显式地指定命令。有关显式设置命令以便将对 DataSet 的更新解析回数据源的信息,请参见使用 DataAdapter 和 DataSet 更新数据库。

您可能需要将输出参数映射回 DataSet 的更新行。一项常见的任务是从数据源中检索自动生成的标识字段或时间戳的值。默认情况下,CommandBuilder 不会将输出参数映射到更新行中的列。在这种情况下,将需要显式指定命令。有关将自动生成的标识字段映射回插入行的列的示例,请参见检索“标识”或“自动编号”值。

lunix_ly 2003-10-17
  • 打赏
  • 举报
回复
请各位高手帮我提提思路!等待!
shajie 2003-10-17
  • 打赏
  • 举报
回复
用数据适配器的update方法试一试
lunix_ly 2003-10-17
  • 打赏
  • 举报
回复
是否我的这种方法是无法实现的?
那是否有其它的方法来实现这种数据传输问题?
lunix_ly 2003-10-16
  • 打赏
  • 举报
回复
问题是我想在A电脑上自动生成sql文本文件,然后在B电脑上运行sql文件,将数据自动插入数据库。
用你的方法无法实现!B电脑中还未有数据
kuangren 2003-10-16
  • 打赏
  • 举报
回复
用 SELECT 子查询为一行或多行指定数据值。
INSERT INTO MyTable (PriKey, Description)
SELECT ForeignKey, Description
FROM SomeView

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧