C#数据库ConnectionString属性尚未初始化

时间:2015-02-08 14:44:43

标签: c# sql-server database stored-procedures

我试图在我的数据库中插入值,每当我尝试添加它时,我的程序就会崩溃,给我一个错误,即ConnectionString属性尚未初始化,但我正确初始化它。这是我的代码:

private static string conStr = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\users\aldrin\documents\visual studio 2013\Projects\MidtermAssignment_Ramirez\MidtermAssignment_Ramirez\MasterFile.mdf;Integrated Security=True";
    SqlConnection myCon = new SqlConnection();

    private int studId, year, units; 
    private string fName, lName, mName, course, payment;

    public void insertRecord()
    {
        myCon.Open();
        SqlCommand insertInfo = new SqlCommand("spInsertStudentInformation", myCon);
        insertInfo.CommandType = CommandType.StoredProcedure;
        insertInfo.Parameters.Add("@studId", SqlDbType.Int).Value = studId;
        insertInfo.Parameters.Add("@fName", SqlDbType.VarChar).Value = fName;
        insertInfo.Parameters.Add("@lName", SqlDbType.VarChar).Value = lName;
        insertInfo.Parameters.Add("@mName", SqlDbType.VarChar).Value = mName;
        insertInfo.ExecuteNonQuery();
        myCon.Close();
        myCon.Open();
        SqlCommand insertData = new SqlCommand("spInsertStudentData", myCon);
        insertData.CommandType = CommandType.StoredProcedure;
        insertData.Parameters.Add("@studId", SqlDbType.Int).Value = studId;
        insertData.Parameters.Add("@course", SqlDbType.VarChar).Value = course;
        insertData.Parameters.Add("@year", SqlDbType.Int).Value = year;
        insertData.Parameters.Add("@units", SqlDbType.Int).Value = units;
        insertData.Parameters.Add("@payment", SqlDbType.VarChar).Value = payment;
        insertData.ExecuteNonQuery();
        myCon.Close();
    }

以下是我的按钮中的代码:

myData.StudId = Convert.ToInt32(txtStudId.Text);
        myData.FName = txtFName.Text;
        myData.LName = txtLName.Text;
        myData.MName = txtMName.Text;
        myData.Course = cboCourse.SelectedItem.ToString();
        myData.Year = Convert.ToInt32(cboYear.SelectedItem.ToString());
        myData.Units = Convert.ToInt32(txtUnits.Text);
        myData.Payment = cboPayment.SelectedItem.ToString();
        myData.insertRecord();

这是我的存储过程:

CREATE PROCEDURE [dbo].spInsertStudentData
@studId int,
@course varchar(50),
@year int,
@units int,
@payment varchar(50)
AS
    INSERT INTO StudentData VALUES (@studId, @course, @year, @units, @payment)
RETURN 0

CREATE PROCEDURE [dbo].spInsertStudentInformation
@studId int,
@fName varchar(50),
@lName varchar(50),
@mName varchar(50)
AS
    INSERT INTO StudentInformation VALUES (@studId, @fName, @lName, @mName)
RETURN 0

我最近在ASP.NET学习数据库,这就是我正在做的事情,但我不知道为什么在C#中运行不正常。

4 个答案:

答案 0 :(得分:5)

错误消息很明确。在尝试打开连接之前,SqlConnection对象需要一个连接字符串。因此,在构建连接时,您需要传递连接字符串或在打开之前设置ConnectionString属性。

但我真的建议你开始使用本地连接变量而不是全局连接变量。并将此声明保留在using语句

private static string conStr = @".....";
public void insertRecord()
{
    using(SqlConnection myCon = new SqlConnection(conStr))
    using(SqlCommand insertInfo = new SqlCommand("spInsertStudentInformation", myCon))
    {
        myCon.Open();
        insertInfo.CommandType = CommandType.StoredProcedure;
        ....
        insertInfo.ExecuteNonQuery();

        // No need to close the connection here....


        SqlCommand insertData = new SqlCommand("spInsertStudentData", myCon);
        insertData.CommandType = CommandType.StoredProcedure;
        ....
        insertData.ExecuteNonQuery();
    }
}

SqlConnection使用Connection Pooling基础结构,因此最好使用可以通过连接池回收的本地变量,而不会为程序保留重要资源

最后,using statement避免了危险的内存泄漏关闭和处理一次性对象,如连接和命令,如果出现异常

您的代码中还有另一点需要注意。您执行两个相关的命令。如果由于某种原因您无法插入学生数据,我确信您不想插入学生信息。这些场景要求打开一个SqlTransaction,使您的数据原子(意味着如果任何操作失败,您不想更改数据库中的任何内容)

    using(SqlConnection myCon = new SqlConnection(conStr))
    using(SqlCommand insertInfo = new SqlCommand("spInsertStudentInformation", myCon))
    {
        myCon.Open();
        using(SqlTransaction ts = myCon.BeginTransaction())
        {
           insertInfo.CommandType = CommandType.StoredProcedure;
           insertInfo.Transaction = ts;
           ....
           insertData.CommandType = CommandType.StoredProcedure;
           insertData.Transaction = ts;
           ....
           insertData.ExecuteNonQuery();
           ts.Commit();
       }
    }

最终的Commit将保留数据库中的所有内容,而退出using块而不调用Commit,将自动回滚对表进行的每个更改

答案 1 :(得分:4)

您需要将第一行中创建的连接字符串提供给连接构造函数:

SqlConnection myCon = new SqlConnection(conStr);

答案 2 :(得分:0)

错误信息非常清楚;

  

ConnectionString属性尚未初始化

您可以将其设为ConnectionString propertyconStr;

myCon.ConnectionString = conStr;

或者您可以在constructor上将其指定为参数;

SqlConnection myCon = new SqlConnection(conStr);

史蒂夫说;将SqlConnection保存为全局变量不是一个好主意。使用局部变量并使用using statement来处置您的连接和命令。

using(SqlConnection myCon = new SqlConnection(conStr))
using(SqlCommand insertInfo = myCon.CreateCommand())
{
   ...
}

答案 3 :(得分:0)

使用.net核心和依赖项注入:

首先,初始化一个私有只读字符串,这里我称为_connString。 然后创建要在其中注入连接字符串的类的构造函数,如下所示:

private readonly string _connString;
    public ClassNameRepository(IConfiguration configuration)
    {
        _connString = configuration.GetConnectionString("DatabaseNameConnString");
    }

使用语句using Microsoft.Extensions.Configuration;导入 确保没有波浪线指示的错误

在您的appSettings.json文件中,添加如下连接字符串:

"ConnectionStrings": {
"DatabaseNameConnString": "add your connection string here"}

*您可以通过在Visual Studio上单击“ SQL Server Object Explorer”(我正在使用2019)来获得连接字符串,然后右键单击要连接的数据库对象,向下滚动到“ properties”然后点击它。将在右侧打开一个属性窗口。找到并复制“连接字符串”值,然后将复制的值放在您的appSettings.json文件中。

try
        {
            using (SqlConnection con = new SqlConnection(_connString))
            {
                using (SqlCommand cmd = new SqlCommand("storedProc", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;

                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();

                    return object;
                }
            }
        }
        catch (Exception)
        {

            throw;
        }

我希望有帮助。

快乐编码。