Вопрос

My DB is simple and looks like this:

DB_Table_Name

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

The db is created with case-sensitive turned OFF i.e., DB is case insensitive.

Recently, I encountered an issue where the db was getting wrongly updated because of case insensitive querying through SELECT query!

This was the previous query:

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

In order to make the above query case sensitive, I have modified it as:

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

Whenever I get exception saying need to convert @OBJName from system.string to system.byte[]

I have tried the following query too:

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

This one throws an exception saying query has an error pointing to COLLATE!!

Would anybody throw some light on this. I'm new to SQL

Edit: BTW, when I execute the above mentioned 2nd and 3rd queries on SQL Query Analyzer I get correct values - case sensitive data. But the same query is somehow not working via C# code :(

tl;dr: I have an SQL query which needs to be made case sensitive which works through C# code

Это было полезно?

Решение

Never mind! Got the answer :)

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;

Apparently, we need to explicitly specifiy the type for each SQL parameter.

BTW, COLLATE did not work..seems to be a bug!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top