我的数据库很简单,看起来像这样:
DB_Table_Name
ID int(4)
Name nvarchar(10)
Desc nvarchar(80)
创建数据库时区分大小写为OFF,即DB不区分大小写。
最近,由于通过SELECT查询进行不区分大小写的查询,我遇到了db被错误更新的问题!
这是之前的查询:
SqlCeCommand myCmd = new SqlCeCommand("select * from DB_Table_Name where Name = @OBJName and ID = @OBJID");
myCmd.Connection = DBConnection;
SqlCeParameter param = new SqlCeParameter();
param.ParameterName = "@OBJName ";
param.Value = parmObj;
SqlCeParameter param2 = new SqlCeParameter();
param2.ParameterName = "@OBJID";
param2.Value = parmID;
myCmd.Parameters.Add(param);
myCmd.Parameters.Add(param2);
reader = myCmd.ExecuteReader();
为了使上述查询区分大小写,我将其修改为:
SqlCeCommand myCmd = new SqlCeCommand("select * from ProgramTable where CAST(ObjName AS varbinary(10)) = CAST(@OBJName AS varbinary(10)) and ID = @OBJID");
myCmd.Connection = DBConnection;
SqlCeParameter param = new SqlCeParameter();
param.ParameterName = "@OBJName ";
param.Value = parmObj;
SqlCeParameter param2 = new SqlCeParameter();
param2.ParameterName = "@OBJID";
param2.Value = parmID;
myCmd.Parameters.Add(param);
myCmd.Parameters.Add(param2);
reader = myCmd.ExecuteReader();
每当我得到异常,说需要将@OBJName从system.string转换为system.byte []
我也尝试了以下查询:
SqlCeCommand myCmd = new SqlCeCommand("select * from ProgramTable where ObjName COLLATE SQL_Latin1_General_CP1_CS_AS = @OBJName and ID = @OBJID");
myCmd.Connection = DBConnection;
SqlCeParameter param = new SqlCeParameter();
param.ParameterName = "@OBJName ";
param.Value = parmObj;
SqlCeParameter param2 = new SqlCeParameter();
param2.ParameterName = "@OBJID";
param2.Value = parmID;
myCmd.Parameters.Add(param);
myCmd.Parameters.Add(param2);
reader = myCmd.ExecuteReader();
这个抛出异常,说查询有错误指向COLLATE !!
有人会对此有所了解吗?我是SQL的新手
编辑:BTW,当我在SQL查询分析器上执行上述第二和第三个查询时,我得到了正确的值 - 区分大小写的数据。但同样的查询在某种程度上无法通过C#代码工作:(
tl; dr:我有一个SQL查询需要区分大小写才能通过C#代码
答案 0 :(得分:0)
SqlCeCommand myCmd = new SqlCeCommand("select * from ProgramTable where CAST(ObjName AS varbinary(10)) = CAST(@OBJName AS varbinary(10)) and ID = @ID");
myCmd.Connection = DBConnection;
myCmd.Parameters.Add("@OBJName", SqlDbType.NVarChar, 10).Value = ObjName;
myCmd.Parameters.Add("@ID", SqlDbType.Int, 4).Value = IDValue;
显然,我们需要为每个SQL参数显式指定类型。
顺便说一句,COLLATE没有用。似乎是一个错误!