我在C#中使用N tiers tec for ado,尝试使其易于使用并且能够更改任何数据库类型,而不再重写所有鳕鱼,
我的代码在这里没有得到任何错误,但它没有得到任何值到我的文本框
(我试图从表格到多个文本框中获取数据以便稍后更新)
以及代码如何工作: {
起初我做一些函数来取任何设置任何类型的参数或设置任何命令然后我做其他功能来执行我设置或从数据库获取所有功能我在文件夹名称(数据访问层)中构建它
然后我做了其他文件夹(数据构建层)来使用所有这些功能,我想在任何页面中做什么(插入,更新,删除,选择),
我觉得我把它在(数据构建层)制作的函数调用到我的页面或控件,
我做了所有这些,因为如果我更改数据库类型,我只更改一个类和其他类仍然相同
我希望我解释得足够多(抱歉我的英语不够好)}
代码:
Class DataAccessLayer
public static void Setcommand (SqlCommand cmd,CommandType type,string commandtext)
{
cmd.CommandType=type;
cmd.CommandText=commandtext;
}
public static void AddSQLparameter(SqlCommand cmd, int size,SqlDbType type,object value,string paramName,ParameterDirection direction)
{
if (cmd == null)
{
throw (new ArgumentException("cmd"));
}
if (paramName == null)
{
throw (new ArgumentException("paramName"));
}
SqlParameter param=new SqlParameter();
param.ParameterName= paramName;
param.SqlDbType=type;
param.Size=size;
param.Value=value;
param.Direction=direction;
cmd.Parameters.Add(param);
}
public static SqlDataReader ExecuteSelectCommand(SqlCommand cmd)
{
if (cmd == null)
{
throw (new ArgumentNullException("cmd"));
}
SqlConnection con = new SqlConnection();
cmd.Connection = con;
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
con.Close();
return dr ;
}
Class DatabuildLayer
SqlCommand com;
public DatabuildLayer()
{
com = new SqlCommand();
//
// TODO: Add constructor logic here
//
}
public SqlDataReader SelectCatalog(int catid)
{
DataAccessLayer.Setcommand(com, CommandType.Text, "select catname,catdescription,photo from category where catid=@catid" );
DataAccessLayer.addSQLparameter(com,16,SqlDbType.Int,catid,"@catid",ParameterDirection.Input);
return DataAccessLayer.ExecuteSelectCommand(com);;
}
这里是我最后一个将我的数据检索到某个文本框的代码
在我的Pageload中:
protected void Page_Load(object sender, EventArgs e)
{
DatabuildLayer= new DatabuildLayer();
SqlDataReader dr ;
dr = obj.SelectCatalog(catselectddl.SelectedIndex);
if (dr.Read())
{
catnametxt.Text = dr["catname"].ToString();
catdestxt.Text = dr["catdescription"].ToString();
}
}
答案 0 :(得分:1)
查询是否可能不返回任何内容,dr.Read()返回false?假设代码实际执行(这里很难说)可能是阻止它工作的唯一因素 - 无论是那个还是空列。
对于我的价值而言,我认为您的代码需要从结构和约定的角度进行整理。您应该查看代码并考虑.NET框架的命名准则。当其他人阅读您的代码时,他们会希望它格式化并与本文档保持一致。 http://msdn.microsoft.com/en-us/library/xzf533w0(v=vs.71).aspx
此外,目前大多数做ASP.NET的人试图寻找一些方法,使用像WebFormsMVP这样的框架将外部依赖(例如数据库)注入到他们的代码中。 http://webformsmvp.com/与http://code.google.com/p/autofac/提供的自动转帐等IoC容器配合使用。
使用这种方法,您可以将所有外部依赖项从应用程序中推出接口,这将使插入不同的数据库引擎变得相当简单。
答案 1 :(得分:1)
您当前的包装器代码没有做任何特别有用的事情(只是替换现有方法或您自己的执行相同的操作),并且不关闭连接正确。这是......有点乱。
如果您还没有大量熟悉原始ADO.NET接口,那么可以考虑像“dapper”这样的东西,它将为您完成所有这些,使用 sane API :
short catid = 16;
using(var conn = GetOpenConnection()) {
var row = conn.Query(
"select catname,catdescription,photo from category where catid=@catid",
new { catid }).FirstOrDefault();
if(row != null) {
string name = row.catname, desc = row.catdescription;
// ...
}
}
或者,如果您有一个具有CatName / CatDescription属性的类:
var obj = conn.Query<Catalogue>(
"select catname,catdescription,photo from category where catid=@catid",
new { catid }).FirstOrDefault();
答案 2 :(得分:0)
根据我的经验,当您关闭与DataReader关联的连接时,无法再从阅读器中检索到任何内容。
//You closed the connection before returning the dr in the your method below:
public static SqlDataReader ExecuteSelectCommand(SqlCommand cmd)
{
if (cmd == null)
{
throw (new ArgumentNullException("cmd"));
}
SqlConnection con = new SqlConnection();
cmd.Connection = con;
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
con.Close(); //here your connection was already closed
return dr ; //this dr is disconnected
}