将uniqueidentifier转换为字符串并在Where子句

时间:2017-01-26 23:57:36

标签: c# mysql sql

找出答案并编辑了问题,现在就可以了。

这是我的例子

我数据库中的CustomerID列设置为uniqueidentifier。

C#

string cid = ( This is a variable; it could be ANY guid the user chooses. )   

查询字符串

                   " SELECT * FROM [db]
                    WHERE (CAST(CustomerID AS VARCHAR(100)) LIKE '%"+cid+@"%');"

CustomerID字段不评估具有相同cid的行。所以cid在使用uniqueidentifier(CustomerID)进行评估时遇到了麻烦。

3 个答案:

答案 0 :(得分:0)

如果like也是CustomerID,则您不需要uniqueidentifier

WHERE (CAST(CustomerID AS VARCHAR(36)) = @cid)

答案 1 :(得分:0)

我看到了一些可能的问题;

  • 没有为ISNULL定义条件,例如ISNULL(柱,valueifnull)。
  • 此外,实际查询必须指定在该结构中使用ISNULL的列。
  • 缺少"结束括号"在ISNULL上。

这样的事情应该有效:

SELECT ISNULL( ( SELECT Column1 FROM MyTable WHERE (CAST(CustomerID AS VARCHAR(100)LIKE '%"+cid+@"%') ) ,'')

答案 2 :(得分:0)

不要通过将用户输入连接到查询中的字符串来构建查询。这可能导致sql injection这是严重问题。

相反,您应该使用parametrized queries,其中您以参数的形式将用户输入传递给查询。然后,底层框架/驱动程序/ etc将确保以不会意外成为sql代码的方式准备用户输入。

这样的事情:

Guid cidAsGuid = new Guid(cid);
MySqlCommand command = new MySqlCommand("SELECT * FROM [db] WHERE CustomerId = @customerID");
command.Parameters.AddWithValue("@customerID", cidAsGuid);

然后您可以使用该命令执行阅读器或填写适配器或您需要做的其他事情。

这样做的另一个好处是,CustomerId列上的索引可用于加速查询,而如果您通过将CustomerIdGuid转换为{来进行搜索{1}}表示数据库必须扫描整个表。对于小型表,您不会注意到太大的差异,但对于大型表,差异将是显着的。