C#检查SQL错误中是否存在记录

时间:2011-07-14 14:02:57

标签: c# sql .net

我正在使用此代码检查'guid'表中是否已存在值(guid1):

string selectString = "SELECT guid" + "FROM trafficScotland" + "WHERE guid = " + guid1;

SqlCommand myCommand = new SqlCommand(selectString, myConnection);
String strResult = String.Empty;
strResult = (String)myCommand.ExecuteScalar();

 if (strResult.Length == 0)

但是在

 strResult = (String)myCommand.ExecuteScalar();

行,我收到sqlException错误

  

'guid'附近的语法

请告诉我这里有什么问题?

9 个答案:

答案 0 :(得分:12)

"SELECT guid" + "FROM trafficScotland" + "WHERE guid ="

这是:

SELECT guidFROM trafficScotlandWHERE guid =

无论如何将它分解为单独的字符串是没有意义的,但是你在单词之间缺少空格:)

string resultGuidAsString = null;

// build command object
string cmdQuery = "SELECT guid FROM trafficScotland WHERE guid=@guid";
SqlCommand myCmd = new SqlCommand(cmdQuery, myConnection);

// safely pass in GUID parameter value
myCmd.Parameters.AddWithValue("@guid", guid1);

// read result, check for nulls in DB
object result = myCmd.ExecuteScalar();
if (result != DBNull.Value && result != null)
{
    resultGuidAsString = result.ToString();
}

^^这是一个改进版本。如果我可以批评几点:

  • 您的查询没有使用任何参数:只需构建一个字符串。安全性,可读性和可维护性风险
  • 据推测,您正在检查是否有带guid的条目,表明可能没有,但是如果没有
  • ,则不会检查DBNull.Value
  • 有点令人困惑 - 您正在返回string但正在处理Guid s。奇数。

答案 1 :(得分:6)

做这样的事情:

var selectString = "SELECT 1 FROM trafficScotland WHERE guid = @guid"
var myCommand = new SqlCommand(selectString, myConnection);
myCommand.Parameters.AddWithValue("@guid", guid1);

var itExists = (Int32)myCommand.ExecuteScalar() > 0;
if (itExists) {
    // do stuff...
}

答案 2 :(得分:2)

selectString = "SELECT guid " + "FROM trafficScotland" + " WHERE guid = '" + guid1 +"'";

guid后注意空格

答案 3 :(得分:2)

每个人都告诉你问题是什么。是的,你的查询不正确。但是你未来的疑问呢?你怎么想看看他们是对的?

我强烈建议您使用 SQL Server Profiler 。 Profiler位于您的应用程序和数据库引擎之间,并掌握传递给数据库引擎的每个命令和查询。因此,您可以看到传递给SQL Server的内容,获取它,并尝试在SQL Server Management Studio中执行它以进行调试。

答案 4 :(得分:2)

理想情况下,您可以使用参数来防止SQL注入。他们还会处理诸如引用需要引用的值(如GUID)之类的内容:

var selectString =  "SELECT guid FROM trafficScotland WHERE guid = @guid";
var myCommand = new SqlCommand(selectString, myConnection);
myCommand.Parameters.AddWithValue("@guid", guid1);
strResult = (String)myCommand.ExecuteScalar();

答案 5 :(得分:2)

首先,您必须修复间距,将一部分查询连接在一起,并且缺少重要的sql server关键字之间的空间。

  

选择guidFROM trafficScotlandWHERE guid

其次,您应该使用命名参数。这将有助于避免sql注入,这可以防止你不得不考虑是否需要单引号或不在你的sql变量周围。

var query = "SELECT guid FROM trafficScotland WHERE guid = @guid";
using(var command = new SqlCommand(query, connection))
{
    command.Parameters.AddWithValue("@guid", guid1);

    var result = command.ExecuteScalar();

    // Compare guid1 to result
}

答案 6 :(得分:1)

如上所述,因为您忘记了一些空格,所以您正在运行以下查询

SELECT guidFROM trafficScotlandWHERE guid = {guid here}

正确的间距是首先要解决的问题。

答案 7 :(得分:1)

试试这个:

string selectString = "SELECT guid FROM trafficScotland WHERE guid = '" + guid1 + "'";

答案 8 :(得分:0)

空格+用其他人提到的“'”包围guid。您还应将GUIDs存储为UNIQUEIDENTIFIERs(假设为MSSQL)