2009-10-02 7 views
1

Je tente de lier 3 zones de texte à une classe qui récupère les enregistrements précédemment stockés pour chacune des 3 zones de texte. Je ne sais pas comment récupérer 3 valeurs différentes d'une classe dans une perspective orientée objet. Je sais comment retourner les chaînes simples, bool, etc vars mais pas plus de 1 à la fois.C# Liaison de plusieurs zones de texte à la base de données

exemple d'une méthode simple retour bool J'utilise, comment puis-je régler pour revenir 3 variables de chaîne séparées - Code Snippet:

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 Snippet:

<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> 

Répondre

1

Vous devrez retourner votre propre structure avec les 3 valeurs. Vous pouvez faire un tableau, mais vous devez vous assurer que vous savez quel élément du tableau correspond à la zone de texte avec une structure de données que vous n'avez pas, pour vous rappeler [0] == la première zone de texte, et vous pouvez utiliser plus de lisibilité et plus facile à maintenir.

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

Merci, j'aime la façon dont ça se fait, ça va faire un tour maintenant.Également aimé les fautes d'orthographe du public :) – Alex

+0

Juste essayé et a obtenu un petit problème avec chacun des Gets et des ensembles: Erreur 'Package.Sql.Sql.Comments.MyFirstComment.get' doit déclarer un corps parce qu'il est non marqué abstract ou extern – Alex

+0

La chaîne publique MyFirstString {get; ensemble; } est pour .NET 3.5, si vous utilisez .NET 2.0 ou .NET 1.1 vous devez déclarer un membre privé, puis faire le get et le set. –

1

Conserver les chaînes dans un jeu de données ou un lecteur de données les renvoie ensuite à votre niveau approprié.

1

Que voulez-vous retourner?

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

Vous pouvez faire la même chose avec et type, par exemple bool [], int [] etc vous ensuite accéder aux éléments de la valeur de retour à l'aide

string val = arrStr[0]; 
+0

Il traite avec une base de données pas des données statiques dans un tableau. – JonH

+0

Je montrais juste comment vous construiriez les valeurs de retour. Son extrait de code ne nous montre pas ce qu'il veut retourner. Il dit simplement "comment l'ajuster pour retourner 3 variables de chaînes séparées". Quelles variables de chaîne? – Damian

+0

est-il sûr d'utiliser un tableau pour stocker les chaînes si les chaînes elles-mêmes peuvent être 1000 de caractères de long? Ils seraient stockés dans la base de données comme varchars (max) donc sont assez longs. – Alex

1

Je veux faire une préface avec ce que je ne sais pas ce que vous essayez de faire. Le questionnaire est toujours 3 questions? ou est la taille dynamique?

J'utilise un Repeater si la taille est dynamique (ce qui est l'exemple que je fournis) ou je voudrais utiliser un FormView si la taille est fixé à 3.

Utilisez le code suivant pour accéder à la base de données:

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; 
     } 
    } 
} 

dans votre code derrière vous besoin de quelque chose comme ce qui suit:

<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> 

Et puis dans votre code derrière vous aurez besoin se méthode lecting pour définir les paramètres de la requête:

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

Si vous expliquez la situation un peu plus (ce que tout est nécessaire pour afficher, et la logique de base de données impliquée) Je vais affiner ma réponse pour correspondre plus à vos besoins. J'espère que c'est un bon point de départ.

Questions connexes