我需要创建Web表单应用程序,从SOAP服务返回的数据集中将数据插入到sql server 2014数据库表中。我使用下一个代码:
DataSet ds;
string conStr = ConfigurationManager.ConnectionStrings["myDb"].ConnectionString;
SqlConnection conn = new SqlConnection(conStr);
SqlDataAdapter adapter = new SqlDataAdapter("select * from catalog", conn);
SqlCommand insertCommand = new SqlCommand();
insertCommand.CommandText = "insert into catalog(artId, ardDesc) values(@aid, @desc)";
insertCommand.Connection = conn;
insertCommand.Parameters.Add("@aid", SqlDbType.Int);
insertCommand.Parameters.Add("@desc", SqlDbType.NVarChar);
adapter.InsertCommand = insertCommand;
servProxy.prodService author = new servProxy.prodService();
System.Security.Cryptography.X509Certificates.X509Certificate cert = new System.Security.Cryptography.X509Certificates.X509Certificate(@"D:\locCert\certName.p12", "1234");
if (cert != null)
{
author.ClientCertificates.Add(cert);
try
{
ds = author.GetProdList();
conn.Open();
cmdBuilder = new SqlCommandBuilder(adapter);
adapter.Update(ds.Tables[0]);
}
catch (Exception ex)
{
// handle error
}
finally
{
conn.Close();
}
}
else
{
// handle ...
}
当我运行代码没有任何反应时,我在某处犯了错误,但不知道在哪里。当插入断点可以看到数据集表已成功填充但插入数据库时没有成功。 我可以只将数据插入两列,db表中有15列,数据集中也是如此?数据集和数据库表中的列名相同。
答案 0 :(得分:1)
DataAdapter.Update 方法仅对RowState property设置为 DataRowState.Added 的行应用INSERT命令。
可能,您的服务返回一个DataSet,其中表的行状态等于 DataRowState.Unchanged 。
您别无选择,只能循环查看表格的行并为每一行调用DataRow.SetAdded
try
{
ds = author.GetProdList();
foreach(DataRow row in ds.Tables[0].Rows)
row.SetAdded();
conn.Open();
cmdBuilder = new SqlCommandBuilder(adapter);
adapter.Update(ds.Tables[0]);
}
还要考虑Update方法逐行执行更新,而且这个行有大量行,可能会非常慢。在这种情况下,最好构建一个插入文本块,它们全部连接在一起并用分号分隔(批量更新),当然还有块所需的所有参数。