【问题标题】:Insert SQL data into table in ASP.Net Web Application via textbox通过文本框将 SQL 数据插入到 ASP.Net Web 应用程序中的表中
【发布时间】:2019-03-22 18:52:48
【问题描述】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;


namespace todoassignment1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Visible = false;  
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            string valueUser = txtUsername.Text;

            SqlConnection db = new SqlConnection(SqlDataSource1.ConnectionString);

            SqlCommand cmd = new SqlCommand();

            cmd.CommandType = CommandType.Text;

            //User is the name of the table, UserName is the column 
            cmd.CommandText = "INSERT User (UserName) VALUES ('" + valueUser + "')";

            cmd.Connection = db;

            db.Open();

            try
            {
                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
                Label1.Text = "Success writing into database!";
                Label1.Visible = true;  
            }
            catch (Exception ex)
            {
                Label1.Text = "Error writing into database.";
                Console.WriteLine(ex.Message);
                Label1.Visible = true;
            }
            finally
            {
                db.Close();
            }
        }
    }
}

我在 Default.aspx 页面上添加了 SqlDataSource1,这似乎是成功的,因为我可以在 gridview 中看到 User 表的列名。该表是空的,我要做的就是在文本框中输入输入并将其发送到 UserName 列。 我不是很擅长调试,但我注意到一些我花了几个小时研究的错误。 我尝试过的事情:

  • SQL SMS > 工具 > 选项 > 设计器 > CHECK 防止保存需要重新创建表的更改
  • 使用 System.Data 添加;
  • 添加了 cmd.Connection.Open();
  • 在 catch 语句中添加了要捕获的异常
  • 重新创建整个数据库
  • 四重检查诸如 txtUsername 是正确的文本框 ID 等内容
  • 一遍遍重新配置SqlDataSource1,删除再重新创建
  • 确认web.config中的connectionString正确
  • 使用 web.config 中的确切字符串创建新的 SQLConnection

        SqlConnection db = new SqlConnection("Data Source=NAME-PC\\SQLEXPRESS;Initial Catalog=Assignment;Integrated Security=True");
    
  • 将插入行从串联更改为“INSERT User (UserName) VALUES ('asdf')”以简化代码,但仍然不起作用。

  • 尝试了其他语法

        cmd.CommandText = "INSERT INTO User (UserName) VALUES (@username)";
    
        cmd.Parameters.Add("@username", SqlDbType.NVarChar, 50);
    
        cmd.Parameters["@username"].Value = txtUsername.Text.ToString();
    

来自调试器的线索:

  • 在 autos 中挖掘 cmd 时看到几个“System.InvalidCastExceptions”
  • errorCS0103:当前上下文中不存在名称“ExecuteNonQuery”

  • 运行后总是看到 System.InvalidOperationException

请帮忙。

【问题讨论】:

    标签: c# sql asp.net sql-server-2012 visual-studio-2017


    【解决方案1】:
    static void BtnSubmit_Click(object sender, EventArgs e)
    {
        string valueUser = "test"; //txtUsername.Text;
        using (SqlConnection db = new SqlConnection("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=test;Integrated Security=True"))//SqlDataSource1.ConnectionString);
        {
            SqlCommand cmd = new SqlCommand("INSERT INTO dbo.[User] (UserName) VALUES (@valueUser)", db);
            cmd.Parameters.Add("@valueUser", SqlDbType.VarChar, 50).Value = valueUser;
            //cmd.CommandType = CommandType.Text;
    
            //User is the name of the table, UserName is the column 
            //cmd.CommandText = "INSERT User (UserName) VALUES (@valueUser)";
    
            //cmd.Connection = db;
    
            db.Open();
    
            try
            {
                //cmd.Connection.Open();
                cmd.ExecuteNonQuery();
                /*Label1.Text =*/
                Console.WriteLine("Success writing into database!");
                //Label1.Visible = true;
            }
            catch (Exception ex)
            {
                /*Label1.Text =*/
                Console.WriteLine("Error writing into database.");
                Console.WriteLine(ex.Message);
                //Label1.Visible = true;
            }
            //finally
            //{
                //db.Close();
            //}
        }
    }
    

    几个问题。

    1. insert 的语法是 INSERT INTO TABLE (COLUMNS) VALUES (VALUES) You have "INSERT User (UserName)"...
    2. USER 是 SQL 中的保留字。如果您坚持将其用作表名,则必须将其括在方括号中。
    3. 您打开了两次连接。本身并不是真正的问题,但没有必要。
    4. 始终、始终、始终使用参数。
    5. 我稍微简化了一些。

    如果你修改了我附上的方法,你应该可以复制粘贴它。

    【讨论】:

    • 我认为这是第二个问题,因为我已经尝试了第一个建议。我创建了一个名为 Person 而不是 User 的新表,稍微修改它以获取电子邮件,最后它接受了我的输入。非常感谢!
    • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
    • @marc_s 明白了。我不再费心编写这样的查询,而且这些天主要使用 Dapper。谢谢你的链接,我会读一读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多