2009-10-02 89 views
1

我試圖將3個文本框綁定到一個類,該類爲3個文本框中的每個文本框檢索任何先前存儲的記錄。我不知道如何從面向對象的角度從類中檢索3個不同的值。我知道如何返回單個字符串,布爾等變量,但一次不超過1個。C#將多個文本框綁定到數據庫

一個簡單的布爾返回方法我用,我該如何調整它返回3個獨立的字符串變量的

例子 - 代碼段:

public static Boolean isQuestionnaireComplete(string strHash) 
     { 
      SqlConnection con = Sql.getConnection(); 

      try 
      { 
       SqlCommand cmd = new SqlCommand("SELECT IsComplete FROM UserDetails WHERE Hash='" + strHash + "' AND IsComplete=1"); 
       cmd.Connection = con; 
       DataTable dt = new DataTable(); 
       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       con.Open(); 
       da.Fill(dt); 
       if (dt.Rows.Count == 0) 
       { 
        return false; 
       } 
       else 
       { 
        return true; 
       } 
      } 
      catch 
      { 
       //TODO:log error 
       return false; 
      } 
      finally 
      { 
       con.Close(); 
      } 
     } 

ASPX段:

<asp:TextBox runat="server" ID="txt1" Height="200px" Width="600px"></asp:TextBox> 
<asp:TextBox runat="server" ID="txt2" Height="200px" Width="600px"></asp:TextBox> 
<asp:TextBox runat="server" ID="txt3" Height="200px" Width="600px"></asp:TextBox> 

回答

1

從返回值獲取物品,您將需要與返回自己的結構]等3個值。你可以做一個數組,但是你必須確保你知道數組中的哪一個項與你沒有的數據結構匹配的文本框,要記住[0] ==第一個文本框,並且你可以使用友好名稱更易讀,更易於維護。

public static MyDataStructure isQuestionnaireComplete(string strHash) 
{ 
    SqlConnection con = Sql.getConnection(); 

    try 
    { 
     SqlCommand cmd = new SqlCommand("SELECT IsComplete, FirstString, SecondString, ThridString FROM UserDetails WHERE Hash='" + strHash + "' AND IsComplete=1"); 
     cmd.Connection = con; 
     DataTable dt = new DataTable(); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     con.Open(); 
     da.Fill(dt); 

     if (dt.Rows.Count == 0) 
     { 
      return null; 
     } 
     else 
     { 
      // Populate object from data table 
      DataRow row = dt.Rows[0]; 

      retun new MyDataStructure 
       { 
       MyFirstString = row["FirstString"], 
       MySecondString = row["SecondString"], 
       MyThirdString = row["ThridString"] 
       }; 
     } 
    } 
    catch 
    { 
     //TODO:log error 
     return false; 
    } 
    finally 
    { 
     con.Close(); 
    } 
} 

public class MyDataStructure 
{ 
    public string MyFirstString { get; set; } 
    public string MySecondString { get; set; } 
    public string MyThirdString { get; set; } 
} 
+0

謝謝,我喜歡這樣做的方式,現在給它一個旋風。也喜歡公開拼寫錯誤:) – Alex 2009-10-02 13:27:49

+0

只是試了一下,並得到了與每個獲取和設置一個小問題: 錯誤'Package.Sql.Sql.Comments.MyFirstComment.get'必須聲明一個身體,因爲它是未標記爲抽象或extern – Alex 2009-10-02 13:42:57

+0

公共字符串MyFirstString {get;組; }適用於.NET 3.5,如果您使用的是.NET 2.0或.NET 1.1,則需要聲明私有成員,然後執行get和set。 – 2009-10-02 13:47:03

1

Store中的字符串數據集或數據讀取器會將它們傳遞迴適當的層。

1

你想要返回什麼?

public static string[] ReturnStringArrayMethod() 
{ 
    string[] arrStr = new string[3](); 
    arrStr[0] = "first string"; 
    arrStr[1] = "second string"; 
    arrStr[2] = "third string"; 
    return arrStr; 
} 

你可以做同樣的和類型如布爾[],INT [ 你再使用

string val = arrStr[0]; 
+0

他正在處理數據庫而不是數組中的靜態數據。 – JonH 2009-10-02 13:18:59

+0

我剛纔展示瞭如何構建返回值。他的代碼段沒有向我們展示他想要返回的內容。他只是說「如何調整它以返回3個單獨的字符串變量」。什麼字符串變量? – Damian 2009-10-02 13:20:45

+0

如果字符串本身可能是1000個字符長,那麼使用數組來存儲字符串是安全的嗎?它們將作爲varchars(max)存儲在數據庫中,所以相當長。 – Alex 2009-10-02 13:20:53

1

我想以這種方式作序,我不知道你在做什麼。問卷總是有3個問題?或者是大小動態?

我會用一個Repeater如果大小是動態的(這是我提供的例子)或我會用一個FormView如果尺寸被固定在3

使用以下代碼來訪問數據庫:

namespace BLL 
{ 
    using System; 
    using System.Data; 
    using System.Data.SqlClient; 
    [System.ComponentModel.DataObject] 
    public class QuestionnaireDataObject 
    { 
     public static DataTable isQuestionnaireComplete(string strHash1, string strHash2, string strHash3) 
     { 
      DataTable dt = new DataTable(); 
      using (SqlConnection con = Sql.getConnection()) 
      { 
       SqlCommand cmd = 
        new SqlCommand(
         String.Format("SELECT Hash, IsComplete FROM UserDetails WHERE Hash IN ('{0}', '{1}', '{2}')", 
             strHash1, strHash2, strHash3)); 
       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       da.Fill(dt); 
       da.Dispose(); 
      } 

      return dt; 
     } 
    } 
} 

在後面的代碼,你需要像下面這樣:

<asp:Repeater id="Repeater1" runat="server" datasourceid="ObjectDataSource1"> 
    <ItemTemplate> 
     <asp:CheckBox id="CheckBox1" runat="server" checked='<%# Bind("IsComplete") %>' /><asp:TextBox 
      id="TextBox1" runat="server" text='<%# Bind("Hash") %>'></asp:TextBox> 
    </ItemTemplate> 
</asp:Repeater> 
<asp:ObjectDataSource id="ObjectDataSource1" runat="server" selectmethod="isQuestionnaireComplete" 
    typename="Bll.QuestionnaireDataObject" onselecting="ObjectDataSource1_Selecting"></asp:ObjectDataSource> 

然後在後面的代碼,你將需要SE lecting方法來設置參數查詢:

protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) 
{ 
    e.InputParameters["strHash1"] = strHash1Value; 
    e.InputParameters["strHash2"] = strHash2Value; 
    e.InputParameters["strHash3"] = strHash3Value; 
} 

如果您解釋(涉及所有需要什麼樣的顯示,和數據庫邏輯)的情況多一點,我會改進我的回答,儘可能滿足您的需求。我希望這是一個很好的起點。