web-dev-qa-db-ja.com

selectステートメントの戻り値

私はこの小さな問題を抱えています。 selectステートメントの結果の値を文字列変数に取得したい。このような

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

選択した処理値を文字列変数に配置します。これどうやってするの。ありがとう

5
mac007

ExecuteReader() ではなく、 ExecuteNonQuery() を使用します。 ExecuteNonQuery()は、影響を受けた行の数のみを返します。

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

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

または、それより usingステートメント を使用します。

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

ただし、SqlCommandが_1_列のみを返す場合は、 ExecuteScalar() メソッドを使用できます。次のように、最初の行の最初の列を返します。

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

また、コードを SQLインジェクション で開くこともできます。常にパラメーター化されたクエリを使用します。 Jeffは パラメーター化されたSQLを与えるか、私に死を与える と呼ばれるクールなブログ記事を持っています。よくお読みください。 DotNetPerl SqlParameter の記事もお読みください。 SQLインジェクションは、クエリを操作するときに非常に重要です。

20
Soner Gönül

スカラーを実行:データベースから単一の値を取得 データベースから単一の値(たとえば、集計値)を取得するメソッド。

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

その他の方法: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());
}
4
Vishal Suthar

答え:

String res = cmd1.ExecuteScalar();

備考:SQLインジェクションを防ぐためにパラメーター化されたクエリを使用する

1
tschmit007

サンプルコードには多くの誤りがあります。

  1. インラインSQLがあり、これによりSQLインジェクションが可能になります。
  2. ExecuteNonQuery()を使用しているため、データが返されません。

     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

コマンドのExecuteScalarメソッドを使用する必要があるだけです。これにより、結果セットの最初の行と列に値が表示されます。

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

SQLステートメントが複数の行/列を返す場合は、ExecuteReader()を使用できます。

0
Rich Andrews

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