如何使Sql Command区分大小写?

时间:2013-09-25 12:11:44

标签: c# .net casting ado.net sqlcommand

我的数据库很简单,看起来像这样:

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#代码

1 个答案:

答案 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没有用。似乎是一个错误!

相关问题