web-dev-qa-db-de.com

Rückgabewert einer select-Anweisung

Ich habe dieses kleine Problem. Ich möchte den resultierenden Wert einer select-Anweisung in eine String-Variable abrufen. So was

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

Ich möchte, dass der ausgewählte Behandlungswert in eine Zeichenfolgenvariable eingefügt wird. Wie kann ich das machen. Vielen Dank

4
mac007

Verwenden Sie ExecuteReader() und nicht ExecuteNonQuery() . ExecuteNonQuery() gibt nur die Anzahl der betroffenen Zeilen zurück.

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

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

Oder verwenden Sie besser eine using -Anweisung dafür.

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

Wenn Ihre SqlCommand jedoch nur die Spalte 1 zurückgibt, können Sie die Methode ExecuteScalar() verwenden. Es gibt die erste Spalte der ersten Zeile wie folgt zurück:

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

Sie können Ihren Code auch für SQL Injection öffnen. Verwenden Sie immer parametrisierte Abfragen. Jeff hat einen coolen Blog-Artikel namens Gib mir parametrisiertes SQL oder gib mir den Tod . Bitte lesen Sie es sorgfältig durch. Lesen Sie auch DotNetPerl SqlParameter Artikel. SQL Injection ist sehr wichtig, wenn Sie Abfragen bearbeiten.

20
Soner Gönül

Skalar ausführen: Einzelnen Wert aus der Datenbank abrufen - Methode zum Abrufen eines einzelnen Werts (z. B. eines aggregierten Werts) aus einer Datenbank.

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

Andere Möglichkeit:ExecuteReader ()

try
{
    cmd1.CommandText ="SELECT treatment FROM appointment WHERE [email protected]";
    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

die Antwort:

String res = cmd1.ExecuteScalar();

die Bemerkung: Verwenden Sie eine parametrisierte Abfrage, um die SQL-Injection zu verhindern

1
tschmit007

Es ist viel falsch mit Ihrem Beispielcode.

  1. Sie haben Inline-SQL, wodurch Sie in erheblichem Maße für die SQL-Injektion geöffnet sind.
  2. Sie verwenden ExecuteNonQuery (), was bedeutet, dass Sie keine Daten zurückerhalten.

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

Sie müssen nur die ExecuteScalar-Methode des Befehls verwenden. Dadurch erhalten Sie den Wert in der ersten Zeile und Spalte der Ergebnismenge.

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

Wenn Ihre SQL-Anweisung mehr als eine Zeile/Spalte zurückgibt, können Sie ExecuteReader () verwenden.

0
Rich Andrews

Sie müssen OleDbAdapter verwenden.

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