SQL c# INSERT查询发送并不实际添加任何新条目到表中

本文关键字:任何新 添加 不实际 INSERT 查询 SQL | 更新日期: 2023-09-27 18:12:30

我目前正在使用c#尝试在SQL数据库上执行查询。SELECT查询可以正常工作,但是INSERT查询不能。

我已经从SQL Server管理器本身启动了相同的查询,它工作得很好,但是当我从c#发送它时(使用带有文本框的ASP页面来指定为列发送的值),页面只是刷新,不显示任何错误。

SELECT查询工作的事实告诉我服务器连接良好,这不是问题。我在c#代码中使用了断点来检查变量是否正确地从文本框中发送,并且它们应该是。

你知道出了什么问题吗?

代码如下:

  protected void SendMyData_OnClick(object sender, EventArgs e)
    {
        //(NO RECORD SET IS NEEDED IN THIS FUNCTION SEEING AS HOW WE'RE NOT FETCHING ANYTHING) 
         SqlConnection conServer = new SqlConnection(CDatabase.ConnectionString());
        // Database variables
        string Track_Name   = TextBox8.Text;
        string Track_No     = TextBox10.Text;
        long TN             = Convert.ToInt64(Track_No);
        string Artist_ID    = TextBox11.Text;
        long ArtID          = Convert.ToInt64(Artist_ID);
        string Album_ID     = TextBox12.Text;
        long AlbID          = Convert.ToInt64(Album_ID);
        //SUB THESE INTO THE SQL QUERY 
        try
        {
            string qrySQL = string.Format("INSERT INTO Tracks ([Track_Name],[Track_No],[Artist_ID],[Album_ID]) VALUES ({0}, {1}, {2}, {3})", Track_Name, TN, ArtID, AlbID);
            //This is the string Used to send (Note the NonReturn(As we aren't fetching anything) : " conServer.Open();CDatabase.ExecuteNonReturnQuery(qrySQL);"
            conServer.Open();
            //(NO RECORD SET IS NEEDED IN THIS FUNCTION SEEING AS HOW WE'RE NOT FETCHING ANYTHING) 
            CDatabase.ExecuteNonReturnQuery(qrySQL);
        }
        catch
        {
        }
        finally
        {
           conServer.Close();
        }

SQL c# INSERT查询发送并不实际添加任何新条目到表中

这里至少有两处严重错误:

  • 您直接在SQL中嵌入值。欢迎来到SQL注入攻击之地。不要那样做。使用参数化SQL,分别指定值。(参见SqlCommand.Parameters的文档中的例子)
  • 你捕捉所有的异常,只是吞下它们,没有记录。这段代码完全有可能抛出一个异常来准确地解释出了什么问题——但你永远不会知道,因为你的代码有隐喻的手指在耳朵里。

我的猜测是,它抛出一个异常,由于轨道名称既没有参数化也没有引号-你在你的SQL中间有一个任意字符串。

捕获所有异常几乎总是错误的,特别是在这个级别。通常你应该让异常传播到更高的级别,在那里你可能有一个顶级的捕获所有块,用于"请求出了问题,我们不想使整个服务器瘫痪"。当然,NET为您提供了其中一种方法,并允许您指定应该如何处理错误。

另外,比起显式地关闭SQL连接,我将把整个东西包装在using语句中(并且只在解析输入之后)。

using (SqlConnection con = new SqlConnection(...))
{
    con.Open();
    using (SqlCommand command = ...)
    {
        // Execute the command
    }
}

最后,变量命名不一致——有时使用camelCase,有时使用PascalCase。在Pascal中看到大小写变量是很不寻常的,老实说——同样地,带下划线的变量也是如此。将"Artist"answers"Album"缩写为"Art"answers"Alb"只会使代码可读性降低。

页面将刷新,因为您有一个空catch子句。因此,如果有错误,您将捕获它并吞下错误。

尝试删除catch子句或在其中添加新的'throw',这将返回异常

您的代码抛出了一个由于空catch而未看到的异常。您的文本值周围没有',这使得SQL失败。正如其他人提到的,你应该使用参数化的SQL,这不仅可以解决这个问题,而且还可以保护你的安全(r)从SQL注入攻击

可以:

SqlConnection sqlConnection = new SqlConnection(ConnectionString);
string qrySQL = string.Format("INSERT INTO Tracks ([Track_Name],[Track_No],[Artist_ID],[Album_ID]) VALUES ({0}, {1}, {2}, {3})", Track_Name, TN, ArtID, AlbID);
SqlCommand sqlCommand = new SqlCommand(qrySQL, sqlConnection);
sqlConnection.Open();
sqlCommand.ExecuteNonQuery();

你最好使用参数来避免数据类型和安全问题。

string qrySQL = "INSERT INTO Tracks ([Track_Name],[Track_No],[Artist_ID],[Album_ID]) VALUES (@Track_Name,@Track_No,@Artist_ID,@Album_ID)";
sqlCommand.Parameters.AddWithValue("@Track_Name", "Value");

这是课程作业吗?P

还有,参数周围的方括号是SQL Server的东西吗?我以前从没见过这样写的。我本以为它只是"INSERT INTO Tracks (Track_Name, Track_Number等)……"试着打印出异常…例如

catch Exception e{
print e
}

所以你可以看到发生了什么

不确定确切的语法

第一个值(Track_Name)不应该被引用,因为它是一个字符串?

string qrySQL = string.Format("INSERT INTO Tracks ([Track_Name],[Track_No],[Artist_ID],[Album_ID]) VALUES ('{0}', {1}, {2}, {3})", Track_Name, TN, ArtID, AlbID);

编辑添加

正如其他人所说(在他们更好和更完整的答案中,IMO),您对代码的SQL注入攻击非常开放-我的答案所做的唯一事情就是修复查询,因此它实际上会插入。

当然,正如Jon Skeet指出的那样,您需要使用参数化的SQL。我很欣赏这个被接受的答案,但是Jon的答案是一个更好的整体答案,你应该接受其他用户可能在他们自己的搜索中遇到这个问题,并且应该有最准确和完整的答案(IMO)。