2017-10-05 5 views
-1

Je regarde des questions de requête paramétrées Je n'ai pas pu trouver un exemple d'utilisation de SqlDataReader avec une requête paramétrée pour remplir une liste déroulante.Comment utiliser SqlDataReader avec une requête paramétrée dans C#?

En ce moment je peux remplir mon menu déroulant très bien en utilisant mon code ici

if (!this.IsPostBack) 
{ 
    using (SqlConnection con = new SqlConnection(SQLConnectionString)) 
    { 
     System.Data.SqlClient.SqlCommand go = new System.Data.SqlClient.SqlCommand(); 

     con.Open(); 
     go.Connection = con; 
     go.CommandText = "SELECT InsuredID, FirstName, LastName FROM [Lab2].[dbo].[INSURED]"; 
     go.ExecuteNonQuery(); 

     SqlDataReader readIn = go.ExecuteReader(); 

     while (readIn.Read()) 
     { 
      ddlHomeInsuredID.Items.Add(
       new ListItem(readIn["InsuredID"].ToString() + " : " + readIn["FirstName"].ToString() 
       + " " + readIn["LastName"].ToString())); 
     } 

     con.Close(); 

     ddlHomeInsuredID.Items.Insert(0, new ListItem("--Select InsuredID--", "0")); 
    } 
} 

Cependant, je veux faire de cette instruction select paramétrés. Comment puis-je faire ceci? Je suis mal à écrire des instructions d'insertion paramétrés comme les suivantes:

using (SqlConnection connection = new SqlConnection(SQLConnectionString)) 
{ 
    SqlCommand command = new SqlCommand(); 
    command.Connection = connection; 
    command.CommandType = System.Data.CommandType.Text; 

    command.CommandText = @"INSERT INTO [Lab2].[dbo].[INSURED] ([FirstName], [LastName], [MI], [DateOfBirth], 
[CreditScore], [AddressID], [DriversLicenseNumber], [LastUpdatedBy], [LastUpdated]) VALUES 
(@firstName, @lastName, @middleInitial, @dateOfBirth, @creditScore, @addressID, 
@driversLicenseNumber, @lastUpdatedBy, @lastUpdated)"; 

    command.Parameters.Add("@firstName", SqlDbType.VarChar, 20).Value = Insured.insuredArr[j].getFirstName(); 
    command.Parameters.Add("@lastName", SqlDbType.VarChar, 30).Value = Insured.insuredArr[j].getLastName(); 
    command.Parameters.Add("@middleInitial", SqlDbType.Char, 1).Value = Insured.insuredArr[j].getMiddleInitial(); 
    command.Parameters.Add("@dateOfBirth", SqlDbType.VarChar, 30).Value = Insured.insuredArr[j].getDateOfBirth(); 
    command.Parameters.Add("@creditScore", SqlDbType.Int).Value = Insured.insuredArr[j].getCreditScore(); 
    command.Parameters.Add("@addressID", SqlDbType.Int).Value = Insured.insuredArr[j].getAddressID(); 
    command.Parameters.Add("@driversLicenseNumber", SqlDbType.VarChar, 30).Value = Insured.insuredArr[j].getDriversLicenseNumber(); 
    command.Parameters.Add("@lastUpdatedBy", SqlDbType.VarChar, 20).Value = Insured.insuredArr[j].getLastUpdatedBy(); 
    command.Parameters.Add("@lastUpdated", SqlDbType.Date).Value = Insured.insuredArr[j].getLastUpdated(); 

    connection.Open(); 
    command.ExecuteNonQuery(); 
    connection.Close(); 
} 

MsgBox("Record(s) inserted into database", this.Page, this); 

Alors, comment puis-je faire ma première requête comme le second exemple?

Merci

nammrick

+0

Je ne suis pas sûr, mais je ne pouvais probabky arranger ça googler ... êtes-vous sûr vous devriez avoir 'go.ExecuteNonQuery(); 'Line là-dedans - Je ne pense pas que ça fasse quoi que ce soit dans ce cas. –

+0

Voici un exemple sous "Execute SQL Query with Filter Condition": https://www.aspsnippets.com/Articles/Parameterized-Queries-ADO.Net.aspx –

+0

Ouais qui exécute l'instruction select – nammrick

Répondre

4

Tout d'abord, l'utilisation de ExecuteNonQuery() méthode n'est pas valable pour SELECT requête, juste coller avec ExecuteReader() puisque vous voulez retourner des résultats de la requête. Voici la description de l'utilisation de ExecuteNonQuery méthode:

Vous pouvez utiliser le ExecuteNonQuery pour effectuer des opérations de catalogue (par exemple , l'interrogation de la structure d'une base de données ou la création de bases de données objets tels que des tables), ou pour modifier les données dans une base de données sans en utilisant un DataSet en exécutant les instructions UPDATE, INSERT ou DELETE.

Le flux de requête modifiée doit ressembler à ceci:

using (SqlConnection con = new SqlConnection(SQLConnectionString)) 
{ 
    SqlCommand go = new SqlCommand(); 

    con.Open(); 
    go.Connection = con; 
    go.CommandText = "SELECT InsuredID, FirstName, LastName FROM [Lab2].[dbo].[INSURED]"; 

    SqlDataReader readIn = go.ExecuteReader(); 
    while (readIn.Read()) 
    { 
     // reading data from reader 
    } 

    con.Close(); 

    // other stuff 
} 

Si vous souhaitez utiliser requête paramétrées pour déclaration SELECT, vous avez besoin d'au moins une colonne (et un nom de paramètre) à inclure dans WHERE clause (voir exemple ci-dessous):

SELECT InsuredID, FirstName, LastName FROM [Lab2].[dbo].[INSURED] WHERE InsuredID = @InsuredID 

Ensuite, vous pouvez utiliser SqlParameter pour passer la valeur du paramètre dans la requête ci-dessus:

using (SqlConnection con = new SqlConnection(SQLConnectionString)) 
{ 
    System.Data.SqlClient.SqlCommand go = new System.Data.SqlClient.SqlCommand(); 

    con.Open(); 
    go.Connection = con; 
    go.CommandText = "SELECT InsuredID, FirstName, LastName FROM [Lab2].[dbo].[INSURED] WHERE InsuredID = @InsuredID"; 
    go.Parameters.Add("@InsuredID", SqlDbType.Int).Value = 1; // example value for parameter passing 

    SqlDataReader readIn = go.ExecuteReader(); 
    while (readIn.Read()) 
    { 
     // reading data from reader 
    } 

    con.Close(); 

    // other stuff 
} 

NB: Évitez d'effectuer l'opération INSERT/UPDATE/DELETE en même temps avec peuplant données par SELECT déclaration avec la même connexion active, la connexion précédente doit être fermée d'abord avant d'exécuter une autre requête.

Autres exemples:

How to use string variable in sql statement

How to use sql parameters for a select query?