C#和T-SQL将用户定义的表插入到另一个不工作的表中

C#和T-SQL将用户定义的表插入到另一个不工作的表中,c#,sql-server,tsql,procedure,user-defined-types,C#,Sql Server,Tsql,Procedure,User Defined Types,我计划向SQL Server数据库发送一个数据表,并插入新行。程序中的每一行都将有多个insert POST。不会返回任何错误,但不会将行添加到表中。产品表的列数超过了[dbo].[CSV\u ADDProducts],但我选择了它将映射到的列 有人能发现我犯的错误,或者提出更好的方法吗?谢谢 SQL Server存储过程 CREATE PROCEDURE [dbo].[spUpload_AddBulkProducts] @uploadedTable [dbo].[CSV_ADDProduct

我计划向SQL Server数据库发送一个数据表,并插入新行。程序中的每一行都将有多个insert POST。不会返回任何错误,但不会将行添加到表中。产品表的列数超过了
[dbo].[CSV\u 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#程序

用户定义表

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

我的来源:

注释掉的代码是不起作用的代码<代码>命令.Parameters.AddWithValue(“@uploadeTable”,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; }
                }
            }

您是指程序中的c#表还是用户定义表@Steve Thank如果没有插入任何行,这表明您的参数,
@uploadeTable
中没有任何行。@Steve Thank,np将对此有更多的了解。我将为我用来编写此代码的源代码添加一个链接,但我同意错误列表不希望设置用户定义的表类型。在CMD modeTahnks@Larnu中,我在执行sql命令之前在c#程序中设置了一个中断,参数中的行值在itI中,并将其包装在try catch中(存储过程中)并检查是否违反了任何约束,如主键、外键、空值、字符串值比字段长等。是否存在任何可能干扰的触发器?
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; }
                }
            }