c# - 具有用户定义表类型的 SQL Server 存储过程
问题描述
我在 SQL Server 中有一个存储过程,其参数@Files
是用户定义的表类型。从 C# 代码执行时出现错误:
System.Data.SqlClient.SqlException:'传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。表值参数 3 ("@Files"),第 0 行,第 0 列:数据类型 0xF3(用户定义的表类型)具有指定的非零长度数据库名称。数据库名称不允许使用表值参数,只有模式名称和类型名称有效。
这是我的 C# 代码:
DataTable dt = new DataTable();
dt.Columns.Add("ComputerId", typeof(int));
dt.Columns.Add("FolderId", typeof(int));
dt.Columns.Add("FilePath", typeof(string));
dt.Columns.Add("FileName", typeof(string));
dt.Columns.Add("Size", typeof(long));
dt.Columns.Add("LastWriteTimeUtc", typeof(DateTime));
dt.Columns.Add("ReadOnly", typeof(bool));
foreach (var item in listFileInformation)
{
dt.Rows.Add(1, 1, item.FilePath, item.FileName, item.Size, item.LastWriteUTC, item.ReaddOnly);
}
databaseHelper.AddParameter("@ComputerId", 1);
databaseHelper.AddParameter("@FolderId", 1);
SqlParameter tableTypeParam = new SqlParameter("@Files", SqlDbType.Structured)
{
TypeName = "Inbox.dbo.EngComputerFileTableType",
Value = dt
};
databaseHelper.AddParameter(tableTypeParam);
databaseHelper.ExecuteNonQuery("InsertEngComputerFiles", System.Data.CommandType.StoredProcedure, System.Data.ConnectionState.Open);
databaseHelper.connection.Close();
这是存储过程:
CREATE PROCEDURE [dbo].[InsertEngComputerFiles]
@ComputerId BIGINT,
@FolderId BIGINT,
@Files [dbo].[EngComputerFileTableType] READONLY
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO
[Inbox].[dbo].[EngComputerFile] (
[ComputerId], [FolderId], [FilePath], [FileName],
[Size], [LastWriteTimeUtc], [ReadOnly])
SELECT
@ComputerId, @FolderId, [FilePath], [FileName],
[Size], [LastWriteTimeUtc], [ReadOnly]
FROM
@Files;
UPDATE [Inbox].[dbo].[EngComputer]
SET [LastScanTimeStampUtc] = SYSUTCDATETIME()
WHERE [ComputerId] = @ComputerId;
END
解决方案
消息说这一切你需要改变这一行
SqlParameter tableTypeParam = new SqlParameter("@Files", SqlDbType.Structured)
{
//TypeName = "Inbox.dbo.EngComputerFileTableType",
TypeName = "dbo.EngComputerFileTableType",
Value = dt
};
推荐阅读
- rust - Rust 抱怨在执行联合时没有为 HashSet 实现 BitOr,文档声明它应该是
- django - 在一个 VPS 上服务两个网站
- java - 如何将 Deeplearning4j 的 UIServer 端口从 9000 更改为其他端口?
- python - Python 正则表达式将评论拆分为数据框
- reactjs - 使用 orderId 的任何人都可以看到带有订单详细信息的动态路线是否安全?
- java - Postgresql 使用 Java 应用程序发送到后端时发生 I/O 错误
- php - 我想限制复选框的选择。只应检查一项
- sql - 当前数据集中的行数
- java - StandardJMeterEngine 运行方法未触发 HTTPSampler
- powerbi - 基于 Distinct ID 的平均分数