【问题标题】:How to insert Records in Database using C# language?如何使用 C# 语言在数据库中插入记录?
【发布时间】:2012-08-27 13:20:57
【问题描述】:

我只是 C# 的初学者,所以我需要太多帮助。现在的问题是我设计了一个 Windows 表单,其中有很多字段,如名字、姓氏、地址等。现在我想做的是,当我填写表单并单击插入按钮时,所有信息都会进入数据库。有人知道怎么做吗?

private void button1_Click(object sender, System.EventArgs e)
{
    string connetionString = null;
    SqlConnection cnn ;
    SqlDataAdapter adapter = new SqlDataAdapter();
    string sql = null;
    connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ;

    cnn = new SqlConnection(connetionString);
    sql = "insert into Main (Firt Name, Last Name) values(textbox2.Text,textbox3.Text)";

    try
    {
        cnn.Open();
        adapter.InsertCommand = new SqlCommand(sql, cnn);
        adapter.InsertCommand.ExecuteNonQuery();
         MessageBox.Show ("Row inserted !! ");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

【问题讨论】:

  • 现在有什么要添加的吗?因为看起来值“textbox2.text”和“textbox3.text”可能是
  • 没什么。我用它来检查但一切都是徒劳的。
  • 您的数据库中是否有一个名为“Firt Name”和“Last Name”的列?它们之间真的有空格吗?
  • 我不得不对这个问题投反对票,因为该查询无法成功运行,这表明用户完全缺乏调试,因为该命令从未真正运行过。

标签: c# database visual-studio-2008


【解决方案1】:

您的查询有很多问题。
这是您的代码的修改版本

string connetionString = null;
string sql = null;

// All the info required to reach your db. See connectionstrings.com
connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ;

// Prepare a proper parameterized query 
sql = "insert into Main ([Firt Name], [Last Name]) values(@first,@last)";

// Create the connection (and be sure to dispose it at the end)
using(SqlConnection cnn = new SqlConnection(connetionString))
{
    try
    {
       // Open the connection to the database. 
       // This is the first critical step in the process.
       // If we cannot reach the db then we have connectivity problems
       cnn.Open();

       // Prepare the command to be executed on the db
       using(SqlCommand cmd = new SqlCommand(sql, cnn))
       {
           // Create and set the parameters values 
           cmd.Parameters.Add("@first", SqlDbType.NVarChar).Value = textbox2.text;
           cmd.Parameters.Add("@last", SqlDbType.NVarChar).Value = textbox3.text;

           // Let's ask the db to execute the query
           int rowsAdded = cmd.ExecuteNonQuery();
           if(rowsAdded > 0) 
              MessageBox.Show ("Row inserted!!" + );
           else
              // Well this should never really happen
              MessageBox.Show ("No row inserted");

       }
    }
    catch(Exception ex)
    {
        // We should log the error somewhere, 
        // for this example let's just show a message
        MessageBox.Show("ERROR:" + ex.Message);
    }
}
  • 列名包含空格(应该避免),因此您 需要用方括号括起来
  • 您需要使用using 语句来确保连接 将被关闭并释放资源
  • 您将控件直接放在字符串中,但这不起作用
  • 您需要使用参数化查询来避免引用问题和 sqlinjiection 攻击
  • 无需使用 DataAdapter 进行简单的插入查询
  • 不要使用 AddWithValue,因为它可能是错误的来源(请参阅下面的链接)

除此之外,还有其他潜在问题。如果用户没有在文本框控件中输入任何内容怎么办?在尝试插入之前,您是否对此进行了任何检查? 正如我所说,字段名称包含空格,这会给您的代码带来不便。尝试更改这些字段名称。

此代码假定您的数据库列是 NVARCHAR 类型,如果不是,则使用适当的 SqlDbType enum 值。

请计划尽快切换到更新版本的 NET Framework。 1.1 现在真的过时了。

而且,关于 AddWithValue 问题,本文解释了为什么我们应该避免它。 Can we stop using AddWithValue() already?

【讨论】:

  • C:\Users\umair.javed\Documents\Visual Studio Projects\Air Handling\Form1.cs(278):“System.Data.SqlClient.SqlParameterCollection”不包含“AddWithValue”的定义'
  • 我会将答案更改为与框架 1.1 版本兼容的代码。
  • 我在等你的答复。
  • 既然SqlCommand实现了IDisposible,使用它的块应该用using (SqlCommand cmd = new SqlCommand(sql, cnn))包围。
  • @Umair Javed - 你为什么使用 Visual Studio 2003。Visual Studio 2012 Express 是 100% 免费的。
【解决方案2】:

使用参数化查询防止Sql注入(安全问题)

使用 using 语句关闭连接并释放资源。

using(var connection = new SqlConnection("connectionString"))
{
    connection.Open();
    var sql = "INSERT INTO Main(FirstName, SecondName) VALUES(@FirstName, @SecondName)";
    using(var cmd = new SqlCommand(sql, connection))
    {
        cmd.Parameters.AddWithValue("@FirstName", txFirstName.Text);
        cmd.Parameters.AddWithValue("@SecondName", txSecondName.Text);

        cmd.ExecuteNonQuery();
    }
}

【讨论】:

    【解决方案3】:

    您应该更改您的代码以使用SqlParameters 并将您的插入语句调整为以下内容

    string connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ;
    // [ ] required as your fields contain spaces!!
    string insStmt = "insert into Main ([First Name], [Last Name]) values (@firstName,@lastName)";
    
    using (SqlConnection cnn = new SqlConnection(connetionString))
    {
        cnn.Open();
        SqlCommand insCmd = new SqlCommand(insStmt, cnn);
        // use sqlParameters to prevent sql injection!
        insCmd.Parameters.AddWithValue("@firstName", textbox2.Text);
        insCmd.Parameters.AddWithValue("@lastName", textbox3.Text);
        int affectedRows = insCmd.ExecuteNonQuery();
        MessageBox.Show (affectedRows + " rows inserted!");
    }
    

    【讨论】:

      【解决方案4】:
      sql = "insert into Main (Firt Name, Last Name) values(textbox2.Text,textbox3.Text)";
      

      (名字) 不是有效字段。它应该是 FirstName 或 First_Name。可能是你的问题。

      【讨论】:

        【解决方案5】:

        您应该使用文本框的内容来形成命令:

        sql = "insert into Main (Firt Name, Last Name) values(" + textbox2.Text + 
        "," + textbox3.Text+ ")";
        

        当然,前提是您设法正确打开连接。

        了解您当前的代码发生了什么会很有帮助。如果您在该消息框中显示了一些错误,那么很高兴知道它在说什么。

        您还应该在实际运行命令之前验证输入(即确保它们不包含恶意代码)。

        【讨论】:

          【解决方案6】:

          您应该使用文本框的内容来形成命令:

          sql = "insert into Main (Firt Name, Last Name) values(" + textbox2.Text + "," + textbox3.Text+ ")";
          

          当然,前提是您设法正确打开连接。

          了解您当前的代码发生了什么会很有帮助。如果您在该消息框中显示了一些错误,那么很高兴知道它在说什么。

          您还应该在实际运行命令之前验证输入(即确保它们不包含恶意代码...)。

          【讨论】:

          • 确实应该使用参数化查询而不是查询连接。
          猜你喜欢
          • 2021-10-01
          • 1970-01-01
          • 2017-10-05
          • 1970-01-01
          • 2011-08-11
          • 2018-06-27
          • 1970-01-01
          • 1970-01-01
          • 2017-08-12
          相关资源
          最近更新 更多