Utilisez SqlDataReader et le tableau de strings

Je veux utiliser un lecteur de données pour lire un logging et envoyer le résultat à une string de tableau.

J'utilise une procédure stockée pour sélectionner datatables de 2 tables.

ssortingng ReqID = ""; ssortingng ConnectionSsortingng = ConfigurationManager.ConnectionSsortingngs["ConnectionSsortingng"].ConnectionSsortingng; SqlConnection sqlc; ssortingng[] textbox; ssortingng ReqType; protected void Page_Load(object sender, EventArgs e) { if (Request.QuerySsortingng["ReqID"] != null) ReqID = this.Request.QuerySsortingng["ReqID"]; sqlc = new SqlConnection(ConnectionSsortingng); SqlCommand cmd = new SqlCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "LoadReq"; ssortingng[] textbox = new ssortingng[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.GetSsortingng(reader.GetOrdinal("FReqID")); textbox[3] = reader.GetSsortingng(reader.GetOrdinal("OrderDate")); textbox[4] = reader.GetSsortingng(reader.GetOrdinal("OrderTime")); textbox[5] = reader.GetSsortingng(reader.GetOrdinal("ReqIP")); textbox[6] = reader.GetSsortingng(reader.GetOrdinal("Status")); textbox[7] = reader.GetSsortingng(reader.GetOrdinal("FileCode")); textbox[8] = reader.GetSsortingng(reader.GetOrdinal("Type")); textbox[9] = reader.GetSsortingng(reader.GetOrdinal("DOI")); textbox[10] = reader.GetSsortingng(reader.GetOrdinal("PubMedID")); textbox[11] = reader.GetSsortingng(reader.GetOrdinal("PaperCode")); LoadCorrectForm(textbox[8], textbox); } } 

Et ma procédure stockée est:

 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) 

Mais j'ai une erreur.

Comment dois-je modifier mon code pour faire ce travail?

Comme l'a dit Habib, votre tableau est trop petit. Considérez cette modification. Au lieu de cela:

 ssortingng[] textbox = new ssortingng[4]; 

ou même ceci:

 ssortingng[] textbox = new ssortingng[11]; 

Débarrassez-vous de cette ligne et faites ceci:

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

Suggestions

En plus du correctif, il y a quelques suggestions que vous devriez considérer.

 if (Request.QuerySsortingng["ReqID"] != null) ReqID = this.Request.QuerySsortingng["ReqID"]; using (SqlConnection sqlc = new SqlConnection(ConnectionSsortingng)) { 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()) { ssortingng[] textbox = new ssortingng[reader.FieldCount]; while (reader.Read()) { textbox[2] = reader.GetSsortingng(reader.GetOrdinal("FReqID")); textbox[3] = reader.GetSsortingng(reader.GetOrdinal("OrderDate")); textbox[4] = reader.GetSsortingng(reader.GetOrdinal("OrderTime")); textbox[5] = reader.GetSsortingng(reader.GetOrdinal("ReqIP")); textbox[6] = reader.GetSsortingng(reader.GetOrdinal("Status")); textbox[7] = reader.GetSsortingng(reader.GetOrdinal("FileCode")); textbox[8] = reader.GetSsortingng(reader.GetOrdinal("Type")); textbox[9] = reader.GetSsortingng(reader.GetOrdinal("DOI")); textbox[10] = reader.GetSsortingng(reader.GetOrdinal("PubMedID")); textbox[11] = reader.GetSsortingng(reader.GetOrdinal("PaperCode")); LoadCorrectForm(textbox[8], textbox); } } } ... } } } 

Dans le code modifié, il y a un certain nombre de choses à prendre en count:

  1. Je tire parti de l'instruction using .
  2. J'utilise un autre .ctor de SqlCommand pour le rendre plus concis.
  3. Je FieldCount parti de FieldCount pour déterminer la taille de la masortingce.
  4. Je ne partage pas une instance de connection.
  5. Il y a probablement de meilleures data structures à utiliser ici.
  6. Votre stream de code actuel construit vraisemblablement la connection et la command même si elles n'ont pas besoin d'être utilisées.

Le point # 1 est exceptionnellement important. L'instruction using garantit que l'object créé et utilisé est correctement éliminé. Chaque fois que vous consumz quelque chose qui implémente IDisposable , using instruction using .

Le point n ° 4 est presque aussi important que n ° 1. Ne partagez pas les instances de connection. Lorsque vous en avez besoin, construisez-le, ouvrez-le, utilisez-le et jetez-le.

Laissez-moi élaborer sur le numéro 5 ici. Au lieu d'utiliser une ssortingng[] , que diriez-vous d'une List<ssortingng> . La List<ssortingng> est mutable (ie elle peut changer de taille automatiquement). Le code serait beaucoup plus facile parce que vous pourriez faire quelque chose comme ceci:

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

Ensuite, si vous avez besoin de l'get à une ssortingng[] vous pouvez simplement faire ceci:

 textbox.ToArray(); 

Mais, cela peut ne pas fonctionner bien pour vous ici parce que vous avez un décalage impair. Vous ne commencez pas à insert dans le tableau jusqu'à l'index 2 . Encore une fois, je ne peux pas vraiment dire avec certitude qu'il existe de meilleures data structures.

Le point # 6 est juste intéressant pour moi. Si c'est un PostBack ou que le ReqID est une string vide, vous ne faites rien. Cela m'amène à croire que vous devriez réellement déplacer la création des objects de connection et de command à l'intérieur de ces instructions if , mais c'est juste un stream logique que je préférerais à l'actuel.