【问题标题】:web forms insert data into sql server table from dataset returned by soap serviceWeb 表单将数据从soap 服务返回的数据集中插入到sql server 表中
【发布时间】:2017-04-23 06:46:19
【问题描述】:

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

【问题讨论】:

    标签: .net sql-server dataset


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

    【讨论】:

    • 谢谢史蒂夫。我试过但没有成功。我需要在 DS 表和 DB 表上使用相同的名称吗?怎么找到DS Table的名字,SOAP Service不是我的,我无法控制?
    • 我现在明白了。问题出在 select 语句中,当我输入 SqlDataAdapter adapter = new SqlDataAdapter("select * from [myDb].[dbo].[catalog]", conn); 时,它是成功的。所以,row.SetAdded(); 解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2011-09-21
    相关资源
    最近更新 更多