0

我在从数据库(它是 localDB)的 varbinary(max) 列中插入或选择数据时遇到问题,我似乎无法弄清楚原因。

我正在通过以下方式从 C# 应用程序添加二进制数据。

SqlConnection con = new SqlConnection("<connection string...>");            
SqlCommand cmd = new SqlCommand("sp_test_varbinary", con);

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@content", SqlDbType.VarBinary, -1).Value = Convert.FromBase64String("<base64 string>");

con.Open();
cmd.ExecuteNonQuery();
con.Close();

sp_test_varbinary存储过程只接受一个参数@content并将其插入到 varbinary(max) 列中 - 到目前为止,一切似乎都按预期工作。我不知道 varbinary(max) 列中有什么,因为它只是说binary data,但至少有一些东西。

然后,当我尝试选择刚刚插入的行并尝试取回我最初拥有的 base64 字符串时,出现问题或字段中的数据错误。

我正在执行以下操作(file_id 是我添加的行的 ID)。

SqlDataAdapter da = new SqlDataAdapter("SELECT [content] FROM [BaseFiles] WHERE ([file_id] = '" + file_id + "');", con);
DataSet ds = new DataSet();

da.Fill(ds);

string base64 = Convert.ToBase64String((byte[])ds.Tables[0].Rows["content"]);

然而,此时 base64 变量只包含值:

7w==

知道我缺少什么来完成这项工作吗?

4

1 回答 1

1

查看结果,您很可能没有VARBINARY在存储过程、表或存储过程中的代码中指定长度。

确保在声明VARBINARY变量时将MAX定义包含在声明中。示例您的存储过程应声明如下:

CREATE PROCEDURE [dbo].[sp_test_varbinary]
    @content AS VARBINARY(MAX)
AS
BEGIN

    SET NOCOUNT ON;

    -- YOUR INSERT STATEMENT HERE

END

并且未声明如下:

CREATE PROCEDURE [dbo].[sp_test_varbinary]
    @content AS VARBINARY
AS
BEGIN

    SET NOCOUNT ON;

    -- YOUR INSERT STATEMENT HERE

END

类似地,请确保如果您VARBINARY在存储过程中使用局部变量,它们的长度也已定义。最后确保在表中的列VARBINARY上定义的长度。[content]

于 2018-04-16T14:51:19.807 回答