2017-08-26 5 views
0

ユーザーがログインするたびに更新されるデータベースの値を比較しようとしています。指定したコードでクエリを実行すると何も起こりません。しかし、私はそれを(私は間違ってどこがうまくいくの)試してみましょう> 10の値を与える場合は?整数へのSQL値

private void User_Tick(object sender, EventArgs e) 
{ 
    SqlConnection con13 = new SqlConnection("Data Source = *** ") 

    SqlDataAdapter SDA2 = new SqlDataAdapter("SELECT [User],[Login],[number1],[number2],[number3],[Alertcount] FROM Users.dbo.[Email] where [Alertcount] = 1 and [Alertcount] !=2", con13); 

    DataTable Users = new DataTable(); 
    DataTable DATA2 = new DataTable(); 

    SDA2.Fill(DATA2); 

    dataGridView2.DataSource = DATA2; 

    foreach (DataGridViewRow dr in dataGridView2.Rows) 
    { 
     string col2 = 1.Cells["User"].Value.ToString(); 
     string col1 = 1.Cells["Login"].Value.ToString(); 
     string col3 = 1.Cells["number1"].Value.ToString(); 
     string col4 = 1.Cells["number2"].Value.ToString(); 
     string col5 = 1.Cells["number3"].Value.ToString(); 
     string col6 = 1.Cells["Alertcount"].Value.ToString(); 

     var mine = Convert.ToInt32(col3); 
     var mine2 = Convert.ToInt32(col5); 

     SqlConnection CON2 = new SqlConnection("Data Source = ***") 
     CON2.Open(); 

     SqlDataAdapter SDA = new SqlDataAdapter("SELECT [User],[Login],[Attempt] FROM User.dbo.Actions where [Attempt] > '"+mine+ "' and [Attempt] < '" + mine2 + "'", CON2); 

     DataTable DATA = new DataTable(); 
     SDA.Fill(DATA); 

     dataGridView1.DataSource = DATA; 
    } 
} 

答えて

1

Attemptは(Attempt < 10実行その事実から明らかなように)の整数である場合は、文字列でそれに比較値を渡す必要はありません。だからあなたのクエリは次のようにする必要があります:

SqlDataAdapter SDA = new SqlDataAdapter("SELECT [User],[Login],[Attempt] FROM User.dbo.Actions where [Attempt] > "+mine+ " and [Attempt] < " + mine2 , CON2); 

私はクエリ変数を作成し、エラーが何であるかを確認するために、手動でSQLでクエリを実行することにより、将来的にこのようなエラーをデバッグするために、あなたをお勧めします。 - 正解のために十分ではない情報

var query = "SELECT [User],[Login],[Attempt] FROM User.dbo.Actions where [Attempt] > "+mine+ " and [Attempt] < " + mine2 ; 
SqlDataAdapter SDA = new SqlDataAdapter(query , CON2); 
0

何もを起こりません:あなたはこのような何かを行うことができます。実際に何も起こらない場合は、コードのあるブロックtry catchをすべて削除し、アプリケーションを再度実行してください。次に何かが間違っている場合は、何が間違っているかについて非常に有益な情報をExceptionの形で得るでしょう。

しかし、問題は、間違ったデータをデータベースクエリに渡しているようです。
常にSqlParameterを使用して、動的データをクエリに渡します。 SqlParameterには、操作対象の列の対応するタイプに設定できるタイプがあります。またSqlParameterは、SQLインジェクションからあなたを守ります。使い捨てのオブジェクトの

使用usingことが可能( "常に" 読み)今までに

var emailQuery = 
    @"SELECT [User] ,[Login] ,[number1] ,[number2] ,[number3] ,[Alertcount] 
    FROM Users.dbo.[Email] 
    WHERE [Alertcount] = 1 
     AND [Alertcount] !=2"; // Useless condition, because Alertcount already = 1 

using(var connection2 = new SqlConnection("Data Source = *** ")) 
using(var adapter2 = new SqlDataAdapter(emailQuery, connection1)) 
{ 
    var data2 = new DataTable(); 
    adapter2.Fill(data2); 
    dataGridView2.DataSource = data2; 
} 

var actionsQuery = 
    @"SELECT [User] ,[Login] ,[Attempt] 
    FROM User.dbo.Actions 
    WHERE Attempt > @Mine AND Attempt < @Mine2"; 
foreach (var row in dataGridView2.Rows) 
{ 
    var mine = (int)row.Cells["number1"].Value; // it is already integer, just cast it 
    var mine2 = (int)row.Cells["number3"].Value; 

    using(var connection1 = new SqlConnection("Data Source = *** ")) 
    using(var adapter1 = new SqlDataAdapter(actionsQuery, connection1)) 
    { 
     var parameters = new[] 
     { 
      new SqlParameter 
      { 
       ParameterName = "@Mine", 
       SqlDbType = SqlDbType.Int, 
       Value = mine 
      }, 
      new SqlParameter 
      { 
       ParameterName = "@Mine2", 
       SqlDbType = SqlDbType.Int, 
       Value = mine2 
      } 
     }; 
     adapter1.SelectCommand.Parameters.AddRange(parameters); 

     var data1 = new DataTable(); 
     adapter.Fill(data1); 
     dataGridView1.DataSource = data1 
    }   
}