发送的SQL C#INSERT查询实际上并未向表中添加任何新条目

时间:2011-10-26 08:51:36

标签: c# sql

我目前正在使用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();
        }

6 个答案:

答案 0 :(得分:6)

嗯,至少有两个事情在这里严重错误:

  • 您将值直接嵌入SQL中。欢迎来到SQL Injection Attack Land。 不要这样做。使用参数化SQL,分别指定值。 (有关示例,请参阅SqlCommand.Parameters的文档。)
  • 您正在捕捉所有异常,只是吞下它们,没有记录。完全有可能这个代码抛出了一个例外,它解释了完全出了什么问题 - 但是你永远不会知道,因为你的代码听起来有隐喻的手指。

我的猜测是 因为曲目名称既未参数化也未引用而引发异常 - 您在SQL中间有一个任意字符串。

捕获所有异常几乎总是错误的,特别是在这个级别。通常你应该让异常传播到更高的级别,你可能会有一个顶级的catch-all块,因为“请求出了问题,我们不想关闭整个服务器” - ASP.NET供应当然,其中一个适用于您,并允许您指定应如何处理错误。

此外,我不是明确地关闭SQL连接,而是将整个事物包装在using语句中(并且仅在解析输入之后)。

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

最后,您的变量命名不一致 - 有时您使用的是camelCase,有时您正在使用PascalCase。很难看出Pascal的变量,说实话 - 同样带有下划线的变量。缩写“艺术家”和“专辑”到“艺术”和“Alb”只会使代码的可读性降低。

答案 1 :(得分:0)

页面将刷新,因为您有一个空的catch子句。因此,如果出现错误,您将抓住它并吞下错误。

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

答案 2 :(得分:0)

由于空捕获,您的代码正在吞没您未看到的异常。您的文本值没有'围绕它们,这使SQL失败。其他人提到你应该使用参数化SQL,这不仅可以解决这个问题,还可以保护你免受SQL注入攻击的威胁

答案 3 :(得分:0)

以下工作:

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");

依旧......

答案 4 :(得分:0)

这是一个课程吗?它看起来确实如此:P

另外,参数周围的方括号是SQL Server的东西吗?我以前没有看过这样写过。我原以为它只是“INSERT INTO Tracks(Track_Name,Track_Number等......) 尝试打印出异常......例如

catch Exception e{
print e
}

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

不确定确切的语法

答案 5 :(得分:-1)

不应引用第一个值(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指出的那样,你需要做一些parmaterized SQL。我很欣赏接受的答案,但我的Jon总体答案更好,你应该真的接受这一点 - 其他用户可能会在他们自己的搜索中遇到这个问题,并且应该有最准确和最完整的答案(IMO)。