【问题标题】:Sql Server, Insert and/or Select binary data issueSql Server,插入和/或选择二进制数据问题
【发布时间】:2018-09-25 22:33:15
【问题描述】:

我在从我的数据库(它是一个 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) 列中有什么,因为它只是说 二进制数据,但至少有一些东西。

然后当我尝试选择刚刚插入的行并尝试取回我最初拥有的 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==

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

【问题讨论】:

    标签: sql-server base64 binary-data varbinarymax


    【解决方案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] 列上定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 2014-10-05
      相关资源
      最近更新 更多