2012-07-11 78 views
-2

我一直工作在C#中的项目,这在某些时候我需要在那里他们的文件名是相同的,以比较两个字符串,SQL代码在C#中比较属性

SELECT Hash 
FROM Beamer.PackageDetailFile (NOLOCK) 
WHERE FileName = '"+fileName+"' ; 

这不是工作,桌子和列名是正确的。但是,

SELECT Hash FROM Beamer.PackageDetailFile (NOLOCK) 

此代码给我哈希。

有什么问题?请帮忙谢谢。

问题解决了,fileName即时调用是目录路径而不是文件名,这就是问题所在。正常工作,现在欢呼所有

+6

看看您的键盘。有一个密钥输入。尝试一下。有时非常有用。 – 2012-07-11 07:19:45

+0

我在iphone上键入sory ... – tipi 2012-07-11 07:22:58

+4

当你说不工作你是什么意思?这是否会给出错误消息还是查询返回空?通过加入一个字符串变量,在c#中创建sql语句也是一个非常糟糕的主意。它会让你的代码面临注入攻击。养成使用存储过程或参数化查询的习惯是一种好习惯。 – Purplegoldfish 2012-07-11 07:24:55

回答

0

查询本身应该被罚款,虽然这是非常不好的做法,而应该使用的参数,即

WHERE FileName = @filename 

并使用本地变量的值向名为filename的命令添加一个参数。

原因这可能失败:

  • 大小写;如果CS,然后'abc'不等于'AbC'(如果CI,它是
  • 填充,即[n]char(len) VS [n]varchar(len);一个[n]char(len)被填充与空白右侧,这可以给奇结果
  • unicode的,即N'{blah}' VS '{blah}' - 主要是仅适用于非ASCII的问题“嗒嗒”
  • 长度切边;如果列为[n]varchar(20),而且您的参数长度为80个字符,则它将不匹配列中的修剪版本
+0

感谢您的回答,我正在处理可能的错误。 – tipi 2012-07-11 07:46:08

1

正如人们所说,避免在C#中创建SQL语句。但是,如果你坚持,请检查以确保C#中的'fileName'变量不是空的并且具有正确的值。

我遇到的另一个问题是SQL服务器中列的长度。例如,如果数据库列是varchar(50),并且您的fileName超过50个字符,则比较将失败(您会发现存储在数据库中的文件名被截断)。在这种情况下,你应该改变你的数据库列到一个更大的长度,或只是为varchar(最大)

+0

感谢您的回答,但是这不是可能的错误,因为文件名和列中的文件名大多相同,并且我也没有授权编辑数据库 – tipi 2012-07-11 07:36:47