2013-12-13 23 views
2

我想使用數據讀取器讀取記錄並將結果發送到數組字符串。使用SqlDataReader和字符串數組

我使用存儲過程從2個表中選擇數據。

string ReqID = ""; 
string ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
SqlConnection sqlc; 
string[] textbox; 
string ReqType; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Request.QueryString["ReqID"] != null) 
     ReqID = this.Request.QueryString["ReqID"]; 

    sqlc = new SqlConnection(ConnectionString); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "LoadReq"; 

    string[] textbox = new string[4]; 
    if (!this.IsPostBack) 
    { 
     if (ReqID != "") 
     { 
      cmd.Parameters.Add("@ReqID", SqlDbType.NChar).Value = ReqID; 
      cmd.Connection = sqlc; 
      sqlc.Open(); 

      SqlDataReader reader = cmd.ExecuteReader(); 

      while (reader.Read()) 
      { 
       textbox[2] = reader.GetString(reader.GetOrdinal("FReqID")); 
       textbox[3] = reader.GetString(reader.GetOrdinal("OrderDate")); 
       textbox[4] = reader.GetString(reader.GetOrdinal("OrderTime")); 
       textbox[5] = reader.GetString(reader.GetOrdinal("ReqIP")); 
       textbox[6] = reader.GetString(reader.GetOrdinal("Status")); 
       textbox[7] = reader.GetString(reader.GetOrdinal("FileCode")); 
       textbox[8] = reader.GetString(reader.GetOrdinal("Type")); 
       textbox[9] = reader.GetString(reader.GetOrdinal("DOI")); 
       textbox[10] = reader.GetString(reader.GetOrdinal("PubMedID")); 
       textbox[11] = reader.GetString(reader.GetOrdinal("PaperCode")); 


       LoadCorrectForm(textbox[8], textbox); 
      } 
     } 

而且我的存儲過程是:

CREATE PROCEDURE [dbo].LoadReq 
@ReqID int = 0 
AS 
SELECT 
     Request.FReqID, Request.ReqIP, Request.OrderDate, Request.OrderTime, 
     Request.[Status], Request.FileCode, Request.[Description], 
     Details.[Type], Details.DOI, Details.PubMedID, Details.PaperCode, 
     Details.ISBN, Details.Title, Details.Journal, Details.BookTitle, 
     Details.Conference, Details.[Year], Details.Publisher, Details.Edition, 
     Details.Vol, Details.Issue, Details.pp, Details.[Author(s)], 
     Details.URL 
    FROM 
     Request 
    INNER JOIN 
     Details ON Details.ID = Request.FreqID 
    WHERE 
     (Request.ID = @ReqID) 

但我得到一個錯誤。

我該如何編輯我的代碼來完成這項工作?

+2

你定義了數組''textbox'的大小爲'4',並且你正在設置它的元素'11'? – Habib

+1

爲什麼不使用[List](http://msdn.microsoft.com/en-us/library/6sh2ey19%28v=vs.110%29.aspx)? –

+0

@ user30551479還是數據表?這可能對您有所幫助http://msdn.microsoft.com/zh-cn/magazine/cc188717.aspx。 –

回答

1

正如Habib所述,您的陣列太小。考慮這個修改。取而代之的是:

string[] textbox = new string[4]; 

,甚至這樣的:

string[] textbox = new string[11]; 

擺脫線的和做到這一點:

SqlDataReader reader = cmd.ExecuteReader(); 
string[] textbox = new string[reader.FieldCount]; 

建議

除了修復,有是你應該考慮的一些建議。

if (Request.QueryString["ReqID"] != null) 
    ReqID = this.Request.QueryString["ReqID"]; 

using (SqlConnection sqlc = new SqlConnection(ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand("LoadReq", sqlc)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 

     if (!this.IsPostBack) 
     { 
      if (ReqID != "") 
      { 
       cmd.Parameters.Add("@ReqID", SqlDbType.NChar).Value = ReqID; 

       sqlc.Open(); 
       using (SqlDataReader reader = cmd.ExecuteReader()) 
       { 
        string[] textbox = new string[reader.FieldCount]; 

        while (reader.Read()) 
        { 
         textbox[2] = reader.GetString(reader.GetOrdinal("FReqID")); 
         textbox[3] = reader.GetString(reader.GetOrdinal("OrderDate")); 
         textbox[4] = reader.GetString(reader.GetOrdinal("OrderTime")); 
         textbox[5] = reader.GetString(reader.GetOrdinal("ReqIP")); 
         textbox[6] = reader.GetString(reader.GetOrdinal("Status")); 
         textbox[7] = reader.GetString(reader.GetOrdinal("FileCode")); 
         textbox[8] = reader.GetString(reader.GetOrdinal("Type")); 
         textbox[9] = reader.GetString(reader.GetOrdinal("DOI")); 
         textbox[10] = reader.GetString(reader.GetOrdinal("PubMedID")); 
         textbox[11] = reader.GetString(reader.GetOrdinal("PaperCode")); 

         LoadCorrectForm(textbox[8], textbox); 
        } 
       } 
      } 

      ... 
     } 
    } 
} 

在修改後的代碼有一些事情要注意的:

  1. 我借力using聲明。
  2. 我利用SqlCommand的另一.ctor來使它更簡潔。我使用FieldCount來確定數組的大小。我是不共享連接實例。
  3. 這裏可能有更好的數據結構。
  4. 您當前的代碼流程假設即使不需要使用,也會建立連接和命令。

點#1特別重要。語句using確保創建和使用的對象得到妥善處理。無論何時您使用實施IDisposable的東西,請使用using聲明。

點#4幾乎與#1一樣重要。 不要共享連接實例。當你需要一個,建立它,打開它,使用它,並處置它。

讓我在這裏詳細說明#5。而不是使用string[],怎麼樣List<string>List<string>是可變的(即它可以自動改變大小)。該代碼會容易得多,因爲你可以做這樣的事情:

textbox.Add(reader.GetString(reader.GetOrdinal("FReqID"))); 
textbox.Add(reader.GetString(reader.GetOrdinal("OrderDate"))); 
textbox.Add(reader.GetString(reader.GetOrdinal("OrderTime"))); 
textbox.Add(reader.GetString(reader.GetOrdinal("ReqIP"))); 
textbox.Add(reader.GetString(reader.GetOrdinal("Status"))); 
textbox.Add(reader.GetString(reader.GetOrdinal("FileCode"))); 
textbox.Add(reader.GetString(reader.GetOrdinal("Type"))); 
textbox.Add(reader.GetString(reader.GetOrdinal("DOI"))); 
textbox.Add(reader.GetString(reader.GetOrdinal("PubMedID"))); 
textbox.Add(reader.GetString(reader.GetOrdinal("PaperCode"))); 

然後,如果你需要它得到一個string[]你可能只是這樣做:

textbox.ToArray(); 

但是,可能不在這裏爲你工作很好,因爲你有一個奇怪的偏移量。在索引2之前,您不會開始插入數組。所以再次,我不能真的說肯定有更好的數據結構。

點#6對我來說只是一個有趣的一個。如果它是PostBackReqID是一個空字符串,您實際上沒有做任何事情。這使我相信你應該在這些if聲明中實際移動連接和命令對象的創建,但這只是我比現在更喜歡的邏輯流程。

+0

無法將類型爲「System.Int32」的對象轉換爲鍵入「System.String」。 – user3051479

+1

@ user3051479,ehem,我非常確定告訴我,這對我來說能夠幫助你很重要。 –

+0

第42行:textbox [2] = reader.GetString(reader.GetOrdinal(「FReqID」)); – user3051479