首页 > 解决方案 > 具有用户定义表类型的 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

标签: c#sql-serverstored-proceduresado.net

解决方案


消息说这一切你需要改变这一行

SqlParameter tableTypeParam = new SqlParameter("@Files", SqlDbType.Structured)
{
//TypeName = "Inbox.dbo.EngComputerFileTableType",
TypeName = "dbo.EngComputerFileTableType",

Value = dt
};

推荐阅读