2012-06-02 44 views
0

我使用C#中的N層tec工作,試圖使其易於使用並能夠更改任何數據庫類型,無需重新編寫所有的cod, 我的代碼這裏沒有得到任何錯誤,但它沒有得到任何值到我的文本框
(我想從表中獲取數據到許多文本框以後更新) 和這裏代碼如何工作:{ 使一些函數採取任何設置任何類型的參數或設置任何命令,然後我做其他功能來執行我設置或從數據庫中獲得的所有功能我建立它在文件夾名稱(數據訪問層) 然後我做其他文件夾(數據構建層)使用所有這些功能ri想要在任何頁面上執行(插入,更新,刪除,選擇), 最後認爲我這樣做是爲了將我在(數據構建圖層)製作的函數調用到我的頁面或控件, 我這麼做是因爲if我更改數據庫類型,我只能改變一個類和其他類仍然是相同的 我希望我解釋就夠了(對不起我的英語不夠好)}它沒有從DataReader中獲取任何數據

代碼:

類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 [email protected]"); 
    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(); 
     } 
    } 
+2

您的代碼非常糟糕。我建議你利用數據訪問應用程序塊開始:http://msdn.microsoft.com/en-us/library/ff664408%28v=PandP.50%29.aspx –

+1

無論我讀作DBHelper'或類似: http://stackoverflow.com/questions/9705637/executereader-requires-an-open-and-available-connection-the-connections-curren/9707060#9707060順便說一句,你應該總是緊密連接(使用'使用-statement') –

+0

我認爲你真的很複雜,我可以幫你從數據讀取器獲取數據,但我必須問。您提到您希望能夠在不編寫任何代碼的情況下交換數據庫類型 - 但「com」的價值和設置在哪裏?我問這是因爲select語句本身只能在特定的數據庫引擎中兼容,而且只有當語句非常簡單時纔是如此。如果我們可以根據我的假設簡化這一點,我們將使您的生活變得更加輕鬆。 –

回答

1

是否有可能該查詢返回的任何事情, dr.Read()返回false?假設代碼實際執行(很難從這裏知道),這可能是唯一會阻止它工作的東西 - 無論是空列還是空列。

對於什麼是值得的,我認爲你的代碼需要從結構和約定的角度來整理一下。您應該仔細查看代碼並考慮.NET框架的命名準則。當其他人閱讀你的代碼時,他們會希望它的格式與本文檔一致。 http://msdn.microsoft.com/en-us/library/xzf533w0(v=vs.71).aspx

此外,大多數人在做ASP.NET這些天試圖尋找某種方式結合像autofac IoC容器注入外部依賴(如數據庫)到使用像可用WebFormsMVP框架的代碼在 http://webformsmvp.com/可在http://code.google.com/p/autofac/處獲得。

使用這種方法,您可以將所有外部依賴關係從您的應用程序中移出,這將使得插入不同數據庫引擎變得非常簡單。

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 
} 
+0

對不起,我刪除了con.Close(),仍然沒有檢索到任何數據 – Marwan

1

您當前的包裝代碼沒有做任何事情特別有用(只subsituting現有的方法或您自己的THT 做同樣的事情),它是不正確關閉連接。這是......有點混亂。

如果你是不是已經大規模熟悉原始ADO.NET接口,那麼也許考慮像「dapper」,這將做這一切對你來說,一個健全的API

short catid = 16; 
using(var conn = GetOpenConnection()) { 
    var row = conn.Query(
     "select catname,catdescription,photo from category where [email protected]", 
     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 [email protected]", 
     new { catid }).FirstOrDefault(); 
+0

對不起,我沒有很好地理解你的代碼,在哪一層我應該正確的代碼? (我真的很抱歉,如果我真的很難對你,但我試圖從我的經驗) – Marwan

+0

@Marwan你想要的任何層。請注意,它使用庫來提供擴展方法(Query) –

相關問題