如何在SQL中使用IF EXISTS来检查是否检索到记录?

时间:2014-10-02 22:18:30

标签: c# sql sql-server-ce

以下代码应检查记录是否存在,然后更新它或添加新记录(如果没有开始)。但是它无法解析SQL查询。有什么想法吗?

var db = Database.Open("DB2");

var save = "IF EXISTS (SELECT * FROM QuestionnaireData WHERE ID=" + WebSecurity.CurrentUserId + ") UPDATE QuestionnaireData SET Q1=" + "TEST" + " WHERE ID=" + WebSecurity.CurrentUserId + " ELSE INSERT INTO QuestionnaireData VALUES (@0, @1)";        

db.Execute(save, WebSecurity.CurrentUserId, "TEST");

错误:

  

' /'中的服务器错误应用

     

解析查询时出错。 [令牌行号= 1,令牌   line offset = 1,Token in error = IF]

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.Data.SqlServerCe.SqlCeException:有   解析查询时出错。 [令牌行号= 1,令牌行偏移量   = 1,令牌错误= IF]

     

来源错误:

     

第16行:var save =" IF EXISTS(SELECT * FROM   QuestionnaireData WHERE ID =" + WebSecurity.CurrentUserId +")更新   问卷数据SET Q1 ='" +" TEST" +"' WHERE ID =" +   WebSecurity.CurrentUserId +" ELSE INSERT INTO QuestionnaireData   价值观(@ 0,@ 1)&#34 ;;第17行:第18行:
  db.Execute(save,WebSecurity.CurrentUserId," TEST");第19行:线   20:

     

源文件:c:\ Users \ Blake \ Documents \ Visual Studio   2013 \ WebSites \ MBM \ Questionnaire \ BasicInfo.cshtml行:18

     

堆栈追踪:

     

[SqlCeException(0x80004005):解析查询时出错。 [   令牌行号= 1,令牌行偏移= 1,令牌错误= IF]]
  System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)+136
  System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()+798
  System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(的CommandBehavior   行为,String方法,ResultSetOptions选项)+363
  System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()+53
  WebMatrix.Data.Database.Execute(String commandText,Object [] args)   +115 ASP._Page_Questionnaire_BasicInfo_cshtml.Execute()在c:\ Users \ Blake \ Documents \ Visual Studio中   2013 \ \网站已MBM \问卷\ BasicInfo.cshtml:18个
  System.Web.WebPages.WebPageBase.ExecutePageHierarchy()+197
  System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1   执行者)+68 System.Web.WebPages.WebPage.ExecutePageHierarchy()   +151 System.Web.WebPages.StartPage.RunPage()+ 17 System.Web.WebPages.StartPage.ExecutePageHierarchy()+62
  System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext   pageContext,TextWriter writer,WebPageRenderingBase startPage)+76
  System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase   httpContext)+114

     

版本信息:Microsoft .NET Framework版本:4.0.30319;   ASP.NET版本:4.0.30319.34212

更新的代码:

var check = "SELECT count(*) FROM QuestionnaireData WHERE ID=" + WebSecurity.CurrentUserId;

if (db.Execute(check) == 0)
{
    var insert = "INSERT INTO QuestionnaireData VALUES (@0, @1)";
    db.Execute(insert, WebSecurity.CurrentUserId, "TEST");
}
else {
    var update = "UPDATE QuestionnaireData SET Q1='" + "TEST" + "' WHERE ID=" + WebSecurity.CurrentUserId;
    db.Execute(update);
};

1 个答案:

答案 0 :(得分:2)

编辑,因为您使用的是SQL Server CE:

SQL Server CE does not support IF statements。你必须执行

SELECT count(*) FROM QuestionnaireData WHERE ID=123

本身。然后检查结果,并执行INSERTUPDATE声明。

结束编辑:原始语法错误问题:

你最终得到的SQL看起来像这样:

IF EXISTS (SELECT * FROM QuestionnaireData WHERE ID=123) 
    UPDATE QuestionnaireData SET Q1=TEST WHERE ID=123 
ELSE 
    INSERT INTO QuestionnaireData VALUES (@0, @1)

您的问题是SET Q1=TEST - TEST显然是一个字符串,因此应该引用它:SET Q1='TEST'

请注意,您需要在SQL中使用单引号作为字符串,而不是像C#中那样使用双引号。

所以,你需要改变你的C#代码:

var save = "... SET Q1='" + "TEST" + "' WHERE ...";        

请注意已添加单引号。我已经把双引号留了下来,因为我认为你有一些理由 - 稍后用变量替换TEST?

当然,如果你这样做,你应该只使用另一个参数。