0

私はC#でN層のtecを使って作業し、使いやすく、すべてのコードを書き直すことなくデータベースの種類を変更できるようにしています。ここのコードではエラーは発生しませんが、取得されません。私のテキストボックスへの値
(後で更新するためにテーブルから多くのテキストボックスにデータを取得しようとしています)とここでコードがどのように機能するか:{最初に、任意の種類のパラメーターを設定したり、任意のコマンドを設定したりする関数をいくつか作成します。次に、他の関数を作成して、設定したものを実行したり、データベースから取得したりするすべての関数をフォルダー名(データアクセス層)に作成します。次に、他のフォルダー(データビルドレイヤー)を作成して、任意のページ(挿入、更新、削除、選択)で実行したいすべての関数を使用します。最後に、で作成した関数を呼び出すために実行すると思います。 (データビルドレイヤー)私のページまたはコントロールに、データベースタイプを変更した場合、1つのクラスのみを変更し、他のクラスは同じままであるため、すべてを実行します(英語が不十分で申し訳ありません)}

コード:

クラス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 ;

}

クラス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);;
}

ここに、データをテキストボックスに取得する最後のコードがあります

私のページロードで:

 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();
         }
    }
4

3 に答える 3

1

クエリが何も返さず、dr.Read() が false を返す可能性はありますか? コードが実際に実行されると仮定すると (ここから判断するのは難しい)、おそらくそれが機能を停止する唯一のものです (それまたは空の列のいずれか)。

価値があるのは、構造と慣習の観点から、コードを少し整理する必要があると思います。コードに目を通し、.NET フレームワークの命名ガイドラインを検討する必要があります。他の人があなたのコードを読むとき、彼らはそれがフォーマットされ、このドキュメントと一致していることを望んでいます。http://msdn.microsoft.com/en-us/library/xzf533w0(v=vs.71).aspx

さらに、最近 ASP.NET を使用しているほとんどの人は、 http: //webformsmvp.com/ で入手できる WebFormsMVP のようなフレームワーク と、 autofac はhttp://code.google.com/p/autofac/で入手できます。

このアプローチを使用すると、インターフェイスの背後にあるアプリケーションからすべての外部依存関係をプッシュすることができます。これにより、別のデータベース エンジンを簡単にプラグインできます。

于 2012-06-02T00:45:22.533 に答える
1

現在のラッパー コードは特に有用なことは何も行っておらず (既存のメソッドを置き換えるか、同じことを行う独自のメソッドを使用するだけです)、接続を正しく閉じていません。それは...ちょっと混乱しています。

生の ADO.NET インターフェイスにまだ十分に慣れていない場合は、適切な API を使用してこれらすべてを実行する " dapper " のようなものを検討てください

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();
于 2012-06-02T06:22:14.943 に答える
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
}
于 2012-06-02T02:49:51.613 に答える