web-dev-qa-db-fra.com

Renvoie la valeur d'une instruction select

J'ai ce petit problème. Je veux récupérer la valeur résultante d'une instruction select dans une variable chaîne. Comme ça

OleDbCommand cmd1 = new OleDbCommand();
cmd1.Connection = GetConnection();
cmd1.CommandText = "SELECT treatment FROM appointment WHERE patientid = " + text;
cmd1.ExecuteNonQuery();

Je veux le pour placer la valeur de traitement sélectionnée dans une variable chaîne. Comment puis-je faire ceci. Merci

4
mac007

Utilisez ExecuteReader() et non ExecuteNonQuery() . ExecuteNonQuery() renvoie uniquement le nombre de lignes affectées.

try
{
    SqlDataReader dr = cmd1.ExecuteReader();
}
catch (SqlException oError)
{

}
while(dr.Read())
{
    string treatment = dr[0].ToString();
}

Ou mieux, utilisez une instruction using .

using(SqlDataReader dr = cmd1.ExecuteReader())
{
    while(dr.Read())
    {
        string treatment = dr[0].ToString();
    }
}

Mais si votre SqlCommand ne retourne que la colonne 1, vous pouvez utiliser la méthode ExecuteScalar() . Il retourne la première colonne de la première ligne comme suit: -

cmd.CommandText = "SELECT treatment FROM appointment WHERE patientid = " + text;
string str = Convert.ToString(cmd.ExecuteScalar());

Aussi, vous pouvez ouvrir votre code sur SQL Injection . Toujours utiliser des requêtes paramétrées. Jeff a publié un article de blog intitulé Donnez-moi la SQL paramétrée ou donnez-moi la mort . Veuillez le lire attentivement. Lire aussi DotNetPerl SqlParameter article. L'injection SQL est très importante lorsque vous travaillez avec des requêtes.

20
Soner Gönül

Exécutez Scalar: Obtenir une valeur unique de la base de données méthode pour extraire une valeur unique (par exemple, une valeur agrégée) à partir d'une base de données.

cmd1.Connection = GetConnection();
cmd1.CommandText = "SELECT treatment FROM appointment WHERE patientid = " + text;
if(cmd.ExecuteScalar()==null)
{
    var treatment = cmd.ExecuteScalar();
}

Autre moyen:ExecuteReader ()

try
{
    cmd1.CommandText ="SELECT treatment FROM appointment WHERE patientid=@patientID";
    cmd1.Parameters.AddWithValue("@patientID", this.DropDownList1.SelectedValue);

    conn.Open();
    SqlDataReader dr = cmd1.ExecuteReader();
    while (dr.Read())
    {
        int PatientID = int.Parse(dr["treatment"]);
    }
    reader.Close();
    ((IDisposable)reader).Dispose();//always good idea to do proper cleanup
}
catch (Exception exc)
{
    Response.Write(exc.ToString());
}
3
Vishal Suthar

la réponse: 

String res = cmd1.ExecuteScalar();

la remarque: utiliser une requête paramétrée pour empêcher l'injection SQL

1
tschmit007

Il y a beaucoup de problèmes avec votre exemple de code.

  1. Vous avez inline sql, qui vous ouvre de manière importante l’injection de sql.
  2. Vous utilisez ExecuteNonQuery (), ce qui signifie que vous ne récupérez aucune donnée.

     string sSQL = "SELECT treatment FROM appointment WHERE patientid = @patientId";
     OleDbCommand cmd1 = new OleDbCommand(sSQL, GetConnection()); // This may be slight different based on what `GetConnectionReturns`, just put the connection string in the second parameter.
    
    
        cmd1.Parameters.AddWithValue("@patientId", text);
        SqlDataReader reader = cmd1.ExecuteReader();
        string returnValue;
        while(reader.Read())
        {
           returnValue = reader[0].ToString();
        }
    
0
Clarence Klopfstein
SqlConnection dbConnect = new SqlConnection("your SQL connection string");    
string name = " 'ProjectName' ";
string strPrj = "Select e.type, (e.surname +' '+ e.name) as fulln from dbo.tblEmployees e where id_prj = " + name;
        SqlCommand sqlcmd = new SqlCommand(strPrj, dbConnect);
        SqlDataAdapter sda = new SqlDataAdapter(strPrj, dbConnect);
        ds = new DataSet();
        sda.Fill(ds);
        dbConnect.Open();
        sqlcmd.ExecuteNonQuery();
        dbConnect.Close();
0
Siriojka

Vous devez juste utiliser la méthode ExecuteScalar de la commande - cela vous donnera la valeur à la première ligne et à la première colonne du jeu de résultats.

OleDbCommand cmd1 = new OleDbCommand();
cmd1.Connection = GetConnection();
cmd1.CommandText = "SELECT treatment FROM appointment WHERE patientid = " + text;
var result = cmd1.ExecuteScalar();

Si votre instruction SQL retourne plus d'une ligne/colonne, vous pouvez utiliser ExecuteReader ().

0
Rich Andrews

Vous devez utiliser OleDbAdapter. 

string connection = "your connection";
string query = "SELECT treatment FROM appointment WHERE patientid = " + text;
OleDbConnection conn = new OleDbConnection(connection);
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(query, conn);
adapter.Fill(dataset);
0
Oleg Kovalov