Web表单从soap服务返回的数据集中将数据插入到sql server表中

时间:2017-04-22 22:13:01

标签: .net sql-server dataset

我需要创建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列,数据集中也是如此?数据集和数据库表中的列名相同。

1 个答案:

答案 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方法逐行执行更新,而且这个行有大量行,可能会非常慢。在这种情况下,最好构建一个插入文本块,它们全部连接在一起并用分号分隔(批量更新),当然还有块所需的所有参数。