ExecuteScalar: Connection 属性尚未初始化

oly_love 2010-05-06 02:45:46
我用三层写了个校程序,可是运行即报错,我调了半天都找不到点上,各位大人们帮帮忙,先行谢过……
部分代码:
(DAL层)class DBHelp的内容:
private static SqlConnection connection;
public static SqlConnection Connection
{
get
{
string connectionString = ConfigurationManager.ConnectionStrings["人员管理.Properties.Settings.OperationManagerConnectionString"].ConnectionString;
if (connection == null)
{
connection = new SqlConnection(connectionString );
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Closed)
{
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Broken)
{
connection.Close();
connection.Open();
}
return connection;
}
}
public static string GetScalar(string safeSql)
{
SqlCommand cmd = new SqlCommand(safeSql,connection);
string result = (cmd.ExecuteScalar()).ToString(); //报错行:ExecuteScalar: Connection 属性尚未初始化
return result;
}

class AdminService的内容:
#region 得到数据库的连接
public static readonly string strCon
= ConfigurationManager.ConnectionStrings["人员管理.Properties.Settings.OperationManagerConnectionString"].ToString();
#endregion
public static SqlConnection GetConnection()
{
SqlConnection connection = new SqlConnection(AdminService.strCon);
return connection;
}
public static string GetAdminUserPwdByName(string salesman)
{
using (SqlConnection connection = AdminService.GetConnection())
{
connection.Open();
string strSql = "select OPwd from Office where OSalesman ='" + salesman + "' ";
return DBHelp.GetScalar(strSql);
}
}

(BLL层)class AdminManager 的内容:
public static string GetAdminByName(string salesman)
{
return DAL.AdminService.GetAdminUserPwdByName(salesman);
}
...全文
898 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglihongnier 2011-04-18
  • 打赏
  • 举报
回复
你的两个连接数据库的字符串都是一样的,为什么要写两遍了呢?
oly_love 2010-05-11
  • 打赏
  • 举报
回复
谢谢各位的热心帮忙,我终于找到问题在哪了,有在函数体里声明了一个局部变量,从DAL层中引入数据,终于把数据读回来了,结帖啦!
oly_love 2010-05-10
  • 打赏
  • 举报
回复
我自己是这调了一下,发现在登录页面只要把详细的用户名写上而不是用从程序中读出来的值的话,代码运行OK,可是一旦改成以txtPwd.Trim()和txtType.Trim()方式读出来的值,程序又会报上面的那个错,可是我跟踪了一下,发现在DBHelp以前的数据传输都过了,而且只也读到了,为什么一到DBHelp中就不行了呢?
shixiujin 2010-05-08
  • 打赏
  • 举报
回复
@lz:
不好意思,DBHelp的Conn属性忘记写Get访问器了.
shixiujin 2010-05-08
  • 打赏
  • 举报
回复
@lz您好:
刚才将您的代码测试一下(使用简化的方式书写),没有产生异常.如果您发现那里有和您的想法不一致的地方,可以说一下,方便的话可以交流一下.
提供代码如下:

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
public class AdminServices
{
private static string connString = DBHelp.Conn.ConnectionString;

static void Main()
{
string query = "select count(*) from Customers";
int totalRecordsAffected = (int)DBHelp.ExecuteScalar(query);

Console.WriteLine("输出受影响的行数{0}",totalRecordsAffected);
Console.ReadLine();
}

}


public class DBHelp
{
private static SqlConnection conn = null;

public static SqlConnection Conn
{
if(conn == null)
{
conn = new SqlConnection(ConfigurationManager.ConnectionStrings["configName"].ConnectionString);
}
return conn;
}
public static object ExecuteScalar(string safeStr)
{
object o;
using(SqlConnection conn = Conn)
{
conn.Open();
using(SqlCommand cmd = new (safeStr , conn))
{
o = cmd.ExecuteScalar();
}
conn.Close();
}
return o;
}
}
htwj1998 2010-05-07
  • 打赏
  • 举报
回复
楼主,这个class AdminService是哪个层的...
jerryfangsh 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oly_love 的回复:]

<connectionStrings>
<add name="业务管理系统.Properties.Settings.OperationManagerConnectionString"
connectionString="Data Source=LIUYAN;Initial Catalog=OperationManager;Integrated Secu……
[/Quote]

既然connection由AdminService管理,那么GetScalar方法应该接收一个DbConnection参数,并且由AdminService初始化后传入。
oly_love 2010-05-06
  • 打赏
  • 举报
回复
写错了,那是原来的,粘过来的时候网了改过来,哪位帮帮忙?
阿双2009 2010-05-06
  • 打赏
  • 举报
回复
string connectionString = ConfigurationManager.ConnectionStrings["人员管理.Properties.Settings.OperationManagerConnectionString"].ConnectionString;

而配置文件却是“业务管理系统.Properties.Settings.OperationManagerConnectionString”,这太不和谐吧?! :)
oly_love 2010-05-06
  • 打赏
  • 举报
回复
<connectionStrings>
<add name="业务管理系统.Properties.Settings.OperationManagerConnectionString"
connectionString="Data Source=LIUYAN;Initial Catalog=OperationManager;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
这是config中的配置信息
因为我用的是三层,所以GetSalcar中的Connection必须为从Service层中传来的,而不能用本类的connection,可是我刚试过了,在本页面中得不到Service层中的connection,该怎么解决?
jerryfangsh 2010-05-06
  • 打赏
  • 举报
回复
从这一句开始:

return DBHelp.GetScalar(strSql);

楼主调用了DBHelp类里的静态方法GetScalar。尽管楼主在调用之前仔细地使用了using,并初始化了一个connection,但是很遗憾,这些初始化是在AdminService里完成的,而这一切DBHelp很遗憾的表示对他没有影响。
DBHelp很固执的调用了自己的connection,但是他并不知道该connection从始至终都没有初始化过。尽管楼主给出了一个Connection用于初始化一个SqlConnection,但是DBHelp只知道去调用connection。

是不是很拗口?很纠结?

楼主只需要注意一下自己的变量命名规则,就很容易找出错误了。
阿双2009 2010-05-06
  • 打赏
  • 举报
回复
config里面是怎么写的?
mohugomohu 2010-05-06
  • 打赏
  • 举报
回复
ConfigurationManager.ConnectionStrings["人员管理.Properties.Settings.OperationManagerConnectionString"].ConnectionString
为空,检查web.config或者app.config
wang5225 2010-05-06
  • 打赏
  • 举报
回复
不太熟悉你这种封装connection的写法.
你写到一起再逐步调试看看connection.Open()是否出错


public static string GetScalar(string safeSql)
{
string connectionString = ConfigurationManager.ConnectionStrings["人员管理.Properties.Settings.OperationManagerConnectionString"].ConnectionString;
SqlConnection connection = new SqlConnection(connectionString );
connection.Open();

SqlCommand cmd = new SqlCommand(safeSql,connection);
string result = (cmd.ExecuteScalar()).ToString();
connection.Close();
return result;
}
1、SqlConnection类   构造函数:SqlConnection(connstr);   属性:  Database//获取当前数据库或连接打开后要使用的数据库的名称        Connectionstring//获取或设置用于打开 SQL Server 数据库的字符串   方法:  Open()        Close()        Dispose()//释放所有资源         2、SqlCommand类     构造函数:SqlCommand(string,conn) 属性:  CommandType//获取或设置一个值,该值指示如何解释 CommandText 属         CommandText //获取或设置要对数据源执行SQL 语句         Connection//获取或设置 SqlCommand 的此实例使用的 SqlConnection         Parameters//获取 SqlParameterCollection。参数集合 方法:  ExecuteNonQuery(): 返回受影响函数,如增、删、改操作;         ExecuteScalar():执行查询,返回首行首列的结果;         ExecuteReader():返回一个数据流(SqlDataReader对象)。   实例1: SqlCommand cmd = new SqlCommand () cmd.connection =conn; cmd.CommandType = CommandType.Text; cmd.CommandText ="select *from produce=@ID"; cmd.Parameters.Add("@ID",SqlDBType.NVarChar,10,ID).values=1; cmd.ExecuteScalar();   实例2:   SqlCommand cmd = new SqlCommand (“select *from test”,conn);   cmd.ExecuteScalar(); 注意: ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete 语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚得话返回值为-1,对于这种更新操作 用我们平时所用的是否大于0的判断操作应该没有问题而且比较好,但是对于其他的操作如对数据库结构的操作,如果操作成功时返回的却是-1,这种情况跟我们平时的思维方式有点差距所以应该好好的注意了, 3、SqlDataReader类   是由ExecuteReader()返回一个数据流(SqlDataReader对象)没有构造方法   属性Connection//获取与 SqlDataReader 关联的 SqlConnection。      FieldCount//获取当前行中的列数。      HasRows//获取一个值,该值指示 SqlDataReader 是否包含一行或多行      RecordsAffect//获取执行 Transact-SQL 语句所更改、插入或删除的行数   方法:Read();//使 SqlDataReader 前进到下一条记录      GetType();//获取当前实例的 Type      NextResult();//当读取批处理 Transact-SQL 语句的结果时,使数据读取器前进到下一个结果 4、SqlDataApater类   构造方法:SqlDataApater()        SqlDataAdapter(SqlCommand)//初始化 SqlDataAdapter 类的新实例,用指定的 SqlCommand 作为 SelectCommand 的属性。        SqlDataApater(string,conn)//使用 SelectCommand 和 SqlConnection 对象初始化 SqlDataAdapter 类的一个新实例   属性:  DeleteCommand        SelectCommand        InsertCommand        UpdataCommand              方法:  Fill(DataSet)//在 DataSet 中添加或刷新行        Fill(DataTable)//在 DataSet 的指定范围中添加或刷新行,以与使用 DataTable 名称的数据源中的行匹配。 (继承自DbDataAdapter。        Update(DataRow[])//通过为 DataSet 中的指定数组中的每个已插入、已更新或已删除的行执行相应的 INSERT、UPDATE 或 DELETE 语句来更新数据库中的值        Update(DataSet)//通过为指定的 DataTable 中的每个已插入、已更新或已删除的行执行相应的 INSERT、UPDATE 或 DELETE 语句来更新数据库中的值        Update(DataTable) 实例1   // 隐藏了SqlCommand对象的定义,同时隐藏了SqlCommand对象与SqlDataAdapter对象的绑定 SqlDataAdapter myda= new SqlDataAdapter("select * from test",conn);   实例2   SqlCommand mySqlCommand = new SqlCommand();// 创建SqlCommand   mySqlCommand.CommandType = CommandType.Text;   mySqlCommand.CommandText = "select * from product";   mySqlCommand.Connection = sqlCnt;   SqlDataAdapter myDataAdapter = new SqlDataAdapter();   // 创建SqlDataAdapter   myDataAdapter.SelectCommand = mySqlCommand; // 为SqlDataAdapter对象绑定所要执行的SqlCommand对象 5、DataSet类     命名空间:System.Data.DataSet。   数据集,本地微型数据库,可以存储多张表。  //使用DataSet第一步就是将SqlDataAdapter返回的数据集(表)填充到Dataset对象中:   SqlDataAdapter myDataAdapter = new SqlDataAdapter("select * from product", sqlCnt); DataSet myDataSet = new DataSet(); // 创建DataSet myDataAdapter.Fill(myDataSet, "product"); // 将返回的数据集作为“表”填入DataSet中,表名可以与数据库真实的表名不同,并不影响后续的增、删、改等操作 //访问dataset中的数据 DataTable myTable = myDataSet.Tables["product"]; foreach (DataRow myRow in myTable.Rows) { foreach (DataColumn myColumn in myTable.Columns) { Console.WriteLine(myRow[myColumn]); //遍历表中的每个单元格 } } // 修改DataSet DataTable myTable = myDataSet.Tables["product"]; foreach (DataRow myRow in myTable.Rows) { myRow["name"] = myRow["name"] + "商品"; } // 将DataSet的修改提交至“数据库” SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter); myDataAdapter.Update(myDataSet, "product"); // 添加一行 DataRow myRow = myTable.NewRow(); myRow["name"] = "捷安特"; myRow["price"] = 13.2; //myRow["id"] = 100; id若为“自动增长”,此处可以不设置,即便设置也无效 myTable.Rows.Add(myRow); // 将DataSet的修改提交至“数据库” SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter); myDataAdapter.Update(myDataSet, "product"); // 删除第一行 DataTable myTable = myDataSet.Tables["product"]; myTable.Rows[0].Delete(); SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(myDataAdapter); myDataAdapter.Update(myDataSet, "product");

111,082

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧