【问题标题】:SqlCommand connection string for localhost database本地数据库的 SqlCommand 连接字符串
【发布时间】:2014-05-19 18:29:45
【问题描述】:

我正在尝试在 VS Express for Web 2013 中创建一个可以与数据库“部件”交互的简单网站。我的数据库存储在 app_data 文件夹中。我可以在服务器资源管理器中查看连接,这意味着连接字符串已保存。但是,以下代码会引发 2 个错误:

  1. 错误 13 'System.Data.SqlClient.SqlCommand.SqlCommand(string, System.Data.SqlClient.SqlConnection)' 的最佳重载方法匹配有一些无效参数
  2. 错误 14 参数 2:无法从“字符串”转换为“System.Data.SqlClient.SqlConnection”

我不知道如何解决这个问题。这是我的 C# 代码:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void insertButton_Click(object sender, EventArgs e)
    {
        string connstring =     System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString;
        SqlCommand cmd = new SqlCommand("INSERT INTO PARTS VALUES('" + nameBox.Text + "', '" + descriptionBox.Text + "', '" + quantityBox.Text + "', '" + categoryList.SelectedValue + "')", connstring);
        cmd.ExecuteNonQuery();
    }
}

我对 c# 完全陌生,所以请记住这一点。感谢您的帮助。

更新:下面的代码抛出了两个错误,两个都是:

Error   15  The name 'conn' does not exist in the current context

我是 C# 新手,但看起来代码没有任何问题。名称“conn”在上面已明确定义。

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{

    protected void insertButton_Click(object sender, EventArgs e)
    {
        using (var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString))
        using (var cmd = new SqlCommand(
            "INSERT INTO PARTS VALUES(@name, @description, @quantity, @category)", conn))
        {
            cmd.Parameters.AddWithValue("name", nameBox.Text);
            cmd.Parameters.AddWithValue("description", descriptionBox.Text);
            cmd.Parameters.AddWithValue("quantity", quantityBox.Text);
            cmd.Parameters.AddWithValue("category", categoryList.SelectedValue);
            conn.Open();
            cmd.ExecuteNonQuery();
        }


    }
}

【问题讨论】:

    标签: c# sql database-connection connection-string


    【解决方案1】:
    using(var conn = new SqlConnection(connectionString))
    {
        conn.Open();
        // use conn to create the command
    }
    

    但重要的是:您的 SQL 确实非常危险。这对 SQL 注入是开放的,这是一个巨大而简单的攻击面。请参数化。

    例如:

    using(var conn = new SqlConnection(connectionString))
    using(var cmd = new SqlCommand(
        "INSERT INTO PARTS VALUES(@name, @description, ...)", conn))
    {
        cmd.Parameters.AddWithValue("name", nameBox.Text);
        cmd.Parameters.AddWithValue("description", descriptionBox.Text);
        //...
        conn.Open();
        cmd.ExecuteNonQuery();
    }
    

    (请注意,您需要自己添加一些;我没有填写完整,仅以namedescription 为例)

    【讨论】:

    • 由于某种原因,当我使用您的代码时,会发生这种情况:“conn.Open()”的“错误 16 The name 'conn' does not exist in the current context”
    • @Johnny_Rose 你是不是不小心在第一个using 语句之后添加了{}
    • 不,更新的代码已发布。我可能刚刚做了一些愚蠢的事情,但鉴于我缺乏 c# 专业知识,这很难说。
    • @Johnny 您在第一个 using 语句中添加了一个分号(最右边)。删除它。
    • 啊,谢谢!现在我收到以下异常:“'/' 应用程序中的服务器错误。对象引用未设置为对象的实例。异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。”错误出现在这一行的某处(或者更确切地说,这一行被突出显示):“第 14 行:使用 (var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString))”
    【解决方案2】:

    您的配置中的连接值是什么?

    你可以试试

    SqlConnection conn = new SqlConnection(connstring);
    conn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = conn;
    

    现在发出查询。

    【讨论】:

    • 关于参数化查询如何帮助回答这个问题的注释,因为 OP 对 sql 注入开放
    【解决方案3】:

    您需要先创建一个SqlConnection

    string connstring =     System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString;
    SqlConnection conn = new SqlConnection(connstring);
    SqlCommand cmd = new SqlCommand("INSERT INTO PARTS VALUES('" + nameBox.Text + "', '" + descriptionBox.Text + "', '" + quantityBox.Text + "', '" + categoryList.SelectedValue + "')"
                                   , conn);
    cmd.ExecuteNonQuery();
    

    一些需要养成的早期习惯:

    • 不要连接 SQL 字符串。这有几个原因,其中最重要的是易受 SQL 注入攻击的漏洞。
    • 将您的连接和命令包装在using 语句中。这样可以确保在出现异常时正确关闭连接。

    最终结果将类似于:

    string connstring = ConfigurationManager.ConnectionStrings["connect"].ConnectionString;
    using(SqlConnection conn = new SqlConnection(connstring))
    {
        string sql = "INSERT INTO PARTS VALUES(@name, @description, @quantity, @categoryList)"
        using(SqlCommand cmd = new SqlCommand(sql , conn))
        {
            cmd.Parameters.AddWithValue("@name", nameBox.Text);
            ... etc.
    
            cmd.ExecuteNonQuery();
        }
    }
    

    【讨论】:

    • 这个方法不会抛出任何异常,但是,它也不会向我的表中插入新值。还有什么我需要看的吗?
    • 您使用的是什么数据库?如果使用本地数据库,在构建时会被复制还是重建?
    • 这是一个本地数据库。弹出一个小框(我第一次没有注意到)并显示“用户代码未处理 NullReferenceException”。突出显示的行是 "string connstring = System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString;"
    • 听起来您的连接字符串不在 app.config 文件中(或者没有密钥 "connect"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多