Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接到SQL Server数据库_C#_.net_Sql Server_Tsql_Ado.net - Fatal编程技术网

C# 连接到SQL Server数据库

C# 连接到SQL Server数据库,c#,.net,sql-server,tsql,ado.net,C#,.net,Sql Server,Tsql,Ado.net,一个.NET应用程序,从中建立连接并按如下方式执行查询(包装在try-catch块中): 查询字符串为: createTransactionQuery = "BEGIN " + "BEGIN Transaction" + " BEGIN TRY " + " --variables" +

一个.NET应用程序,从中建立连接并按如下方式执行查询(包装在try-catch块中):

查询字符串为:

createTransactionQuery = "BEGIN " +
                         "BEGIN Transaction" +
                         "  BEGIN TRY " +
                         "      --variables" +
                         "      DECLARE @varStaffID int;" +
                         "      DECLARE @varProductID int;" +
                         "      SET @varStaffID = " + transaction.getStaff().getID() + ";" +
                         "      SET @varProductID = " + transaction.getProduct().getProductID() + ";" +
                         " " +
                         "      --New record in Transactions table " +
                         "      INSERT INTO Transactions (Timestamp_, CustomerID, StaffID, ProductID) " +
                         "      VALUES (SYSDATETIME(),NULL,@varStaffID,@varProductID; " +
                         " " +
                         "      --Update inventory (Products table)" +
                         "      --First retrieve the current quantity of this product" +
                         "      DECLARE @varCurrQuantity int; " +
                         "      SET @varCurrQuantity = (SELECT Quantity FROM Products WHERE ProductID=@varProductID); " +
                         "      --and update it" +
                         "      UPDATE Products " +
                         "      SET Quantity = @varQuantity-1 " +
                         "      WHERE ProductID = @varProductID; " +
                         "  END TRY " +
                         "  BEGIN CATCH " +
                         "      ROLLBACK Transaction " +
                         "  END CATCH " +
                         "COMMIT Transaction" +
                         "END";
此代码引发异常:

系统异常:“开始”附近的语法不正确

我知道可以用更好的方式创建查询字符串。但是,我想知道问题的原因是什么,因为当在SQLServerManagementStudio中执行此查询时,它正在工作


我已确保连接字符串正确无误,因为它在应用程序的不同部分正常工作。

您可以在事务中尝试此操作。从代码中删除第一个开始和最后一个结束,并按照以下说明操作:

BEGIN TRANSACTION trans
  BEGIN TRY  
     --Do some insert or update
     COMMIT TRANSACTION trans
  END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION trans
END CATCH

您可以在事务中尝试此操作。从代码中删除第一个开始和最后一个结束,并按照以下说明操作:

BEGIN TRANSACTION trans
  BEGIN TRY  
     --Do some insert or update
     COMMIT TRANSACTION trans
  END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION trans
END CATCH

这里似乎缺少一个右括号:

VALUES (SYSDATETIME(),NULL,@varStaffID,@varProductID; " 
然而,这种字符串连接容易受到SQL注入攻击。您应该始终使用以避免和消除此类错误

要了解如何使用参数化查询,请参见下面的示例:


这里似乎缺少一个右括号:

VALUES (SYSDATETIME(),NULL,@varStaffID,@varProductID; " 
然而,这种字符串连接容易受到SQL注入攻击。您应该始终使用以避免和消除此类错误

要了解如何使用参数化查询,请参见下面的示例:


您错过了
“提交事务”+“结束”之间的空格
使用此
“提交事务”+“结束”

此外,您还没有声明
varQuantity
,并且在
“值(SYSDATETIME(),NULL,@varStaffID,@varProductID;”

“提交事务”+“结束”;
使用此
“提交事务”+“结束”

此外,您还没有声明
varQuantity
,并且在
“值(SYSDATETIME(),NULL,@varStaffID,@varProductID;”

我正在使用2017。这里似乎缺少一个右括号
值(SYSDATETIME(),NULL,@varStaffID,@varProductID;”
“我知道可以用更好的方式创建查询字符串。“-从那开始。答案指出了几个错误。如果您1)参数化查询,这样就不必进行任何连接,2)切换到逐字字符串(
@“…”
),则可以修复所有错误。”。这里有一个一般性提示:不要向我们展示如何共建字符串。向我们展示结果字符串。并调试该字符串。即,下一行中的createTransactionQuery中的内容。这显然是一个SQL级别的错误,因此调试应该在SQL字符串级别上进行。其余部分(包括获取字符串的代码)只是噪音。还有将其复制/粘贴到SSMS中,以便在逐行项目上获得更好的调试信息。我正在使用2017。这里似乎缺少一个右括号
值(SYSDATETIME(),NULL,@varStaffID,@varProductID;“
”。我知道可以以更好的方式创建查询字符串。“-从那开始。答案指出了几个错误。如果您1)参数化查询,这样就不必进行任何连接,2)切换到逐字字符串(
@“…”
),您可以修复所有错误。这里有一个一般提示:不要向我们展示如何共同构造字符串。显示结果字符串。然后调试那个。i、 e.您在下一行的createTransactionQuery中看到了什么。这显然是一个SQL级别的错误,因此调试应该在SQL字符串级别进行。其余部分(包括获取字符串的代码)只是噪声。你可以将其复制/粘贴到SSMS中,以便逐行获得更好的调试信息。Naveen,你的第一个答案解决了问题中语法错误的原因。该注释导致
BEGIN TRY
之后的所有内容被忽略。那才是真正的答案。纳文,你的第一个答案解决了问题中语法错误的原因。该注释导致
BEGIN TRY
之后的所有内容被忽略。这才是真正的答案。