【发布时间】: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