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);
}
...全文
900 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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;
}

111,101

社区成员

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

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

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