datatable不接受varbinary的值

时间:2009-11-24 00:37:29

标签: c# asp.net sql-server database datatable

值buf的数据类型为varbinary(max),值为0x0000002D

string buF =
    "0x" + BitConverter.ToString((byte[])dt.Rows[i]["BuF"]).Replace("-", "");
    Label3.Text = buF;

我使用该值来查找fileid

DataTable dt = new DataTable();
        SqlConnection connection = new SqlConnection();
        connection.ConnectionString = ConfigurationManager.ConnectionStrings["XYZ"].ConnectionString;
        connection.Open();
        SqlCommand sqlCmd = new SqlCommand("SELECT FileID FROM Backed where MachineID = @machineID  AND BuF =@buF", connection);
        SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
        sqlCmd.Parameters.AddWithValue("machineID", strID);
        sqlCmd.Parameters.AddWithValue("buF", buF);
        sqlDa.Fill(dt);
        connection.Close();

我没有使用buf的值,我没有得到正确的filid ....

但是如果我使用它与value0x0000002D而不是buf我得到文件ID ...为什么会发生这种情况...我尝试了一切但似乎没有任何工作

我需要帮助

3 个答案:

答案 0 :(得分:1)

C#中varbinary的等效类型是byte [],而不是string。另外,正如Hogan所说,AddWithValue试图假设一种数据类型。相反,你可以明确说明:

sqlCmd.Parameters.Add("buF", SqlDbType.VarBinary, -1).Value = yourByteArray;

长度的-1对应于varbinary(max)。

答案 1 :(得分:1)

最好将二进制数据作为byte []使用,如果不必使用,则不使用字符串和字符串转换。这是一个完整的示例,应该用于演示如何读取和查询varbinary(max)类型。

static void Test(SqlConnection openConnection)
{
    using(SqlCommand cmd = openConnection.CreateCommand())
    {
        cmd.CommandText =
            @"create table #Test 
            (bin varbinary(max), num int);
            insert into #Test (bin, num) 
            values (0x0000002D, 1);";
        cmd.ExecuteNonQuery();

        cmd.CommandText = "SELECT TOP 1 bin FROM #Test;";
        byte[] binValue = (byte[])cmd.ExecuteScalar();

        cmd.CommandText = "SELECT * FROM #Test WHERE bin = @bin;";
        var parameter = new SqlParameter("@bin", SqlDbType.VarBinary, -1);
        cmd.Parameters.Add(parameter);
        parameter.Value = binValue;

        DataTable table = new DataTable();
        using (var reader = cmd.ExecuteReader())
        {
            table.Load(reader);
        }

        Debug.Assert(table.Rows.Count == 1);
    }
}

答案 2 :(得分:0)

AddWithValue生成它所看到的类型的参数。当你传递一个long时它使用一个数字,当一个字符串使用ascii时。试试这个: sqlCmd.Parameters.AddWithValue("buF",long.Parse(buF));