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];
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:
using
. .ctor
de SqlCommand
pour le rendre plus concis. FieldCount
parti de FieldCount
pour déterminer la taille de la masortingce. 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.