【问题标题】:Why can't I insert data into my database?为什么我不能将数据插入我的数据库?
【发布时间】:2011-04-24 16:02:11
【问题描述】:

我想做一个非常简单的INSERT INTO 操作,但是没有任何反应。我没有看到任何错误,也没有看到数据库中的任何更改。

我怀疑我的连接字符串是错误的,但我怎么知道呢?如果是这样,我该如何解决? (本地主机)

protected void RegButton_Click(object sender, EventArgs e)
{
   string connString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Bodin\\Desktop\\FullFart\\App_Data\\database.mdf;Integrated Security=True;User Instance=True";
   string sql = "INSERT INTO student (navn, etternavn)  " + "VALUES('" + NavnTextBox.Text + "', '" + EtterNavnTextBox.Text + "');";
   SqlConnection conn = new SqlConnection(connString);

   SqlCommand myCommand = new SqlCommand(sql,conn);

   try
   {
      conn.Open();
      myCommand.ExecuteNonQuery();
   }
   catch (Exception ex)
   {
      Console.WriteLine("Error: " + ex);
   }
   finally
   {
      conn.Close();
   }        
}

任何想法为什么上面的代码什么都不做? (它应该在每次执行时添加新行)

更新

与 SQL 注入有关。这是一些家庭作业的演示程序,这就是我不使用参数的原因。这是我朋友的笔记本电脑,我只安装了 Visual Studion 2008 和 SQL Server 2005。我没有任何其他小工具可以从 Visual Studio 手动将值添加到数据库中,这意味着数据库可以正常工作。但是如何正确配置连接字符串呢?

【问题讨论】:

  • 使用 SQL Server Profiler 运行跟踪,以便查看查询是否执行。
  • 抱歉,我对 .NET 很陌生,我只有 Visual Studio 2008。我在哪里可以选择执行该查询?
  • 你还应该使用参数来避免sql注入(stackoverflow.com/questions/332365/…)。
  • @_simon_:如果我没记错的话,SQL Server Profiler 不是 SQL Server Express 的一部分(这是 sfrj 在查看连接字符串时似乎使用的)
  • ExecuteNonQuery 返回受影响记录的数量。在您的情况下返回什么数字?

标签: c# sql-server visual-studio ado.net


【解决方案1】:

不确定为什么您的连接字符串会出错 - 我个人不喜欢“AttachDbFile”方法。另外:您应该 a) 避免将 SQL 命令字符串连接在一起(因为 SQL 注入攻击),b) 您应该将 SqlConnectionSqlCommand 对象放入 using 块中以避免内存问题。

我的建议是:启动 SQL Server Mgmt Studio Express 并将该数据库附加到您的 SQL Server Express 服务器 - 然后使用类似这样的东西:

string connString = "Server=.\\SQLEXPRESS;database=YourDatabase;Integrated Security=True";

string query = "INSERT INTO dbo.Student(navn, etternavn) " + 
   "VALUES(@navn, @etternvan)";

using(SqlConnection conn = new SqlConnection(connString))
using(SqlCommand myCmd = new SqlCommand(query, conn))
{
   // set up parameters
   myCmd.Parameters.Add("@navn", SqlDbType.VarChar, 100).Value = NavnTextBox.Text.Trim();
   myCmd.Parameters.Add("@etternavn", SqlDbType.VarChar, 100).Value = EtterNavnTextBox.Text.Trim();

   try
   {
       conn.Open();
       myCmd.ExecuteNonQuery();
       conn.Close();
   }
   catch (Exception ex)
   {
      Console.WriteLine("Error: " + ex);
   }
}

从我的角度来看,这样的 SQL 查询看起来不错 - 它应该可以正常工作。

AttachDbFile=UserInstance=true 的问题是(除其他外)它们经常在每次运行应用程序时从头开始初始化数据库。绝对有可能您的插入确实有效,但是下次运行您的应用程序时,它会再次初始化回默认状态,让您相信它没有做任何事情.....

【讨论】:

    【解决方案2】:
     SqlConnection con = new SqlConnection("Server=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Trusted_Connection=True;User Instance=yes");    
     con.Open();
     SqlCommand cmd = new SqlCommand("Insert into pro_details values('" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "')", con);
     cmd.ExecuteNonQuery();
    

    这样使用连接字符串

    con = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2008\\WebSites\\WebSitelab\\App_Data\\Database.mdf;Integrated Security=True;User Instance=True");
    

    请检查您的连接字符串

    string connString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Bodin\\Desktop\\FullFart\\App_Data\\database.mdf;Integrated Security=True;User Instance=True";
    

    【讨论】:

    • 这样写insert语句不好,会导致sql注入,几分钟内就可以搞定你的数据库...
    • 我从不使用这些语句,我一直喜欢在 3 层架构中工作,并将参数传递给方法并触发命令。由于他在 VS 中非常新,所以我建议以这种方式使用。至少他会开始了解问题出在哪里?
    【解决方案3】:

    我知道我来晚了,但我现在正面临这个问题并找到了解决方案。我想分享它,以便如果有人来这里寻求有关此事的帮助......

    所以我所做的就是写的:

    您可以将数据文件留在项目之外并创建一个 在数据库资源管理器中连接到它。当 IDE 要求您携带 把文件放到项目里,说不就行了。这样,设计时 并且运行时将使用相同的数据文件,但缺点是 连接字符串中的路径将被硬编码并且 因此,共享项目和部署应用程序将更加困难。 在部署应用程序之前,只需确保将完整路径替换为 具有相对路径的设置。

    你可以看到here

    【讨论】:

      【解决方案4】:

      如果你是在某家公司写代码,不要像下面这样写,会导致SQL注入。

      string sql = "INSERT INTO student (navn, etternavn)  " + "VALUES('" + NavnTextBox.Text + "', '" + EtterNavnTextBox.Text + "');";
      

      改成...

      nonqueryCommand.CommandText = "INSERT INTO MyTable VALUES (@MyName, @MyNumber)";
      nonqueryCommand.Parameters.Add("@MyName", SqlDbType.VarChar, 30);
      nonqueryCommand.Parameters.Add("@MyNumber", SqlDbType.Int);
      

      为什么它不工作,您可以通过进入 Visual Studio 轻松找出,使用调试选项。使用 Ctrl + Alt + E 并说 break on exceptions 并选择 checkBox 运行时错误,它可以告诉你错误是什么。

      否则,直接粘贴你的 sql 我 sequel server ad 试试看

      【讨论】:

        猜你喜欢
        • 2019-09-07
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        • 2016-08-05
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        相关资源
        最近更新 更多