【问题标题】:C# and T-SQL Insert User Defined Table into a another table not workingC# 和 T-SQL 将用户定义的表插入到另一个表中不起作用
【发布时间】:2021-02-25 12:12:09
【问题描述】:

我计划将数据表发送到 SQL Server 数据库,并INSERT 新行。程序中的每一行都会有多个插入帖子。不会返回错误,但不会将行添加到表中。产品表的列比 [dbo].[CSV_ADDProducts] 多,但我选择了它要映射到的列。

谁能发现我所犯的错误或提出更好的方法来做到这一点?谢谢

SQL Server 存储过程

CREATE PROCEDURE [dbo].[spUpload_AddBulkProducts]
 @uploadedTable [dbo].[CSV_ADDProducts] readonly
 AS
BEGIN TRY
INSERT INTO [dbo].[Products]
([Product Item],[Product SKU],[Product Name],[Product Active],[Product Selling Price],[Product Description],[Product Purchase Description],[Product VAT Code ID],[Product Last Update])
SELECT
[Product Item],[Product SKU],[Product Name],[Product Active],[Product Selling Price],[Product Description],[Product Purchase Description],[Product VAT Code ID],[Product Last Update]
FROM @uploadedTable
END TRY
BEGIN CATCH
END CATCH

C#程序

DataTable POSTCSVCREATE = new DataTable();
        POSTCSVCREATE.Columns.Add("Product Item", typeof(SqlString));
        POSTCSVCREATE.Columns.Add("Product SKU", typeof(SqlInt64));
        POSTCSVCREATE.Columns.Add("Product Name", typeof(SqlString));
        POSTCSVCREATE.Columns.Add("Product Active", typeof(SqlString));
        POSTCSVCREATE.Columns.Add("Product Selling Price", typeof(SqlMoney));
        POSTCSVCREATE.Columns.Add("Product Description", typeof(SqlString));
        POSTCSVCREATE.Columns.Add("Product Purchase Description", typeof(SqlString));
        POSTCSVCREATE.Columns.Add("Product VAT Code ID", typeof(SqlInt64));
        POSTCSVCREATE.Columns.Add("Product Last Update", typeof(SqlDateTime));
        
        foreach (ParseQBProduct.Product i in create)
        {
            var rows = VAT.Tables[0].Select();
            string VATID = "1";
            foreach (DataRow row in rows)
            {
                if (row["VAT Name"].ToString() == i.VAT.ToString())
                {
                    VATID = row["VAT ID"].ToString();
                }
            }
            string dt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");

            if (i.ProductSellingPrice.Trim() != "")
            {
                POSTCSVCREATE.Rows.Add(i.UniqueTitle, Convert.ToInt64(i.manunum), i.name, i.ProductActive, (SqlMoney)Convert.ToDecimal(i.ProductSellingPrice), i.ProductDescription, i.ProductPurchaseDescription, Convert.ToInt64(VATID), (SqlDateTime)Convert.ToDateTime(dt));
                recentAddedfile.Add(i.manunum+" -- " +i.UniqueTitle);
            }
           
        }
        Authentication.LoginUC.instance.Session.Procedure_UploadTable("spUpload_AddBulkProducts", POSTCSVCREATE);

用户定义表

CREATE TYPE [dbo].[CSV_ADDProducts] AS TABLE(
    [Product Item] [nvarchar](max) NULL,
    [Product SKU] [bigint] NULL,
    [Product Name] [nvarchar](max) NULL,
    [Product Active] [nchar](10) NULL,
    [Product Selling Price] [money] NULL,
    [Product Description] [nvarchar](max) NULL,
    [Product Purchase Description] [nvarchar](max) NULL,
    [Product VAT Code ID] [bigint] NOT NULL,
    [Product Last Update] [datetime] NULL
)
GO

当我运行它时,它确实作为 DBMS 上的查询工作

DECLARE @Table AS [dbo].[CSV_ADDProducts]
Insert into @Table
Values ('test',1,'test name','true',10.44,'des','pdes',2,'2020-09-10 12:12:12.000')
EXECUTE spUpload_AddBulkProducts @Table

我的来源:https://www.sqlshack.com/table-valued-parameters-in-sql-server/

【问题讨论】:

  • 你是指程序中的c#表还是用户定义的表? @史蒂夫谢谢
  • 如果没有插入行,则表明您的参数@uploadedTable 中没有任何行。
  • @Steve,谢谢,np 我会多读一点。生病为我用来编码的源添加一个链接,但我同意错误列表不希望在 CMD 模式下设置用户定义的表类型
  • Tahnks @Larnu,我在执行 sql 命令之前在 c# 程序中放了一个中断,并且参数中包含行值
  • 我将它包装在 try-catch 中(在存储过程中)并检查是否违反了任何约束,例如主键、外键、NULL、字符串值比字段长等. 是否有任何可能干扰的触发器?

标签: c# sql-server tsql procedure user-defined-types


【解决方案1】:

注释掉的代码不起作用。 command.Parameters.AddWithValue("@uploadedTable", DT); 工作正常

public bool Procedure_UploadTable(string procedure,DataTable DT)
            {
                DBConn.Open();
                using (var command = new SqlCommand(procedure) { CommandType = CommandType.StoredProcedure })
                {
                    command.Connection = DBConn;
                    command.Parameters.AddWithValue("@uploadedTable", DT);
                    //SqlParameter param = new SqlParameter("@uploadedTable", SqlDbType.Structured)
                    //{
                    //    TypeName = "[dbo].[TBLCSV_ADDProducts]",
                    //    Value = DT
                    //};
                    try
                    {
                        command.ExecuteNonQuery();
                        DBConn.Close();
                        return true;
                    }
                    catch(Exception e) {
                        DBConn.Close();
                        MessageBox.Show(e.Message);
                        return false; }
                }
            }

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 2021-01-20
    • 2020-11-25
    • 2018-07-31
    • 2010-10-09
    • 2022-01-24
    • 2021-08-30
    • 2020-10-19
    相关资源
    最近更新 更多