C# 数据库 ConnectionString 属性 尚未初始化
C# Database The ConnectionString property has not been initialized
我正在尝试在我的数据库中插入值,但每当我尝试添加它时,我的程序就会崩溃,给我一个错误,指出 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# 中不 运行 好。
您需要将在第一行中创建的连接字符串提供给连接构造函数:
SqlConnection myCon = new SqlConnection(conStr);
错误信息很清楚;
The ConnectionString property has not been initialized
您可以将其 ConnectionString
property 设置为 conStr
as;
myCon.ConnectionString = conStr;
或者您可以在 constructor 上将其指定为参数;
SqlConnection myCon = new SqlConnection(conStr);
正如史蒂夫所说;将 SqlConnection
保存为全局变量不是一个好主意。为此使用局部变量并使用 using
statement 来处理您的连接和命令。
using(SqlConnection myCon = new SqlConnection(conStr))
using(SqlCommand insertInfo = myCon.CreateCommand())
{
...
}
错误信息很清楚。 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,使您的数据保持 atomic(这意味着如果 any,您不想更改数据库中的任何内容操作失败)
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 会将所有内容保存在数据库中,同时在不调用 Commit 的情况下退出 using 块,将自动回滚对表所做的每个更改
使用 .net 核心和依赖注入:
首先,初始化一个私有的只读字符串,这里我称之为_connString。
然后创建 class 的构造函数,您要在其中注入连接字符串,如下所示:
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" 并点击它。属性 window 在右侧打开。查找并复制 "Connection String" 值,然后将复制的值传递给 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;
}
希望对您有所帮助。
快乐编码..
我正在尝试在我的数据库中插入值,但每当我尝试添加它时,我的程序就会崩溃,给我一个错误,指出 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# 中不 运行 好。
您需要将在第一行中创建的连接字符串提供给连接构造函数:
SqlConnection myCon = new SqlConnection(conStr);
错误信息很清楚;
The ConnectionString property has not been initialized
您可以将其 ConnectionString
property 设置为 conStr
as;
myCon.ConnectionString = conStr;
或者您可以在 constructor 上将其指定为参数;
SqlConnection myCon = new SqlConnection(conStr);
正如史蒂夫所说;将 SqlConnection
保存为全局变量不是一个好主意。为此使用局部变量并使用 using
statement 来处理您的连接和命令。
using(SqlConnection myCon = new SqlConnection(conStr))
using(SqlCommand insertInfo = myCon.CreateCommand())
{
...
}
错误信息很清楚。 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,使您的数据保持 atomic(这意味着如果 any,您不想更改数据库中的任何内容操作失败)
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 会将所有内容保存在数据库中,同时在不调用 Commit 的情况下退出 using 块,将自动回滚对表所做的每个更改
使用 .net 核心和依赖注入:
首先,初始化一个私有的只读字符串,这里我称之为_connString。 然后创建 class 的构造函数,您要在其中注入连接字符串,如下所示:
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" 并点击它。属性 window 在右侧打开。查找并复制 "Connection String" 值,然后将复制的值传递给 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;
}
希望对您有所帮助。
快乐编码..