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

Ada*_*dam 0 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();
        }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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