2009-11-24 39 views
2

BUF具有数据类型VARBINARY(最大)值的值并且该值是0x0000002D数据表不接受VARBINARY

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 [email protected]", connection); 
     SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd); 
     sqlCmd.Parameters.AddWithValue("machineID", strID); 
     sqlCmd.Parameters.AddWithValue("buF", buF); 
     sqlDa.Fill(dt); 
     connection.Close(); 

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

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

我需要帮助

回答

0

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

1

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

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

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

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); 
    } 
}