1

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

DB_Table_Name

ID   int(4)
Name nvarchar(10)
Desc nvarchar(80)

创建数据库时区分大小写关闭,即数据库不区分大小写。

最近,我遇到了一个问题,因为通过 SELECT 查询不区分大小写查询导致数据库被错误更新!

这是之前的查询:

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 新手

编辑:顺便说一句,当我在 SQL 查询分析器上执行上述第二个和第三个查询时,我得到了正确的值 - 区分大小写的数据。但是相同的查询在某种程度上无法通过 C# 代码工作:(

tl;博士:我有一个 SQL 查询需要区分大小写,它通过 C# 代码工作

4

1 回答 1

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 不起作用..似乎是一个错误!

于 2013-09-26T04:40:42.103 回答