2016-05-17 8 views
1

特定のパラメータで動作しない単純なSQLコマンドがあります。
たとえば、TweetID = 59UserID = 1の場合、値を返します。
ですが、TweetID = 8UserID = 1の場合は値を返しません。
その理由がわかりますか?単純なSQLコマンドは、特定のパラメータでは機能しません。

public static int GetReTweetIdFromReTweetByUserIdAndTweetId(int TweetID,int UserID) 
{ 
    string sql = "SELECT [ReTweetID] FROM [ReTweet] WHERE [TweetID] = [@TID] AND [UserID] = [@UID]"; 
    OleDbConnection conn = ConnectToDb(); 
    OleDbCommand com = new OleDbCommand(sql, conn); 
    com.Parameters.Clear(); 
    OleDbParameter objParamater; 
    objParamater = com.Parameters.Add("[@UID]", OleDbType.Integer); 
    objParamater.Direction = ParameterDirection.Input; 
    objParamater.Value = UserID; 
    objParamater = com.Parameters.Add("[@TID]", OleDbType.Integer); 
    objParamater.Direction = ParameterDirection.Input; 
    objParamater.Value = TweetID; 
    OleDbDataAdapter da = new OleDbDataAdapter(com); 
    DataTable dt = new DataTable(); 
    int id=0; 
    try 
    { 
     conn.Open(); 
     da.Fill(dt); 
     id = int.Parse(dt.Rows[0][0].ToString()); 
    } 
    catch (Exception err) 
    { 
     throw err; 
    } 
    finally 
    { 
     da.Dispose(); 
     dt.Dispose(); 
     com.Dispose(); 
     conn.Close(); 
     conn.Dispose(); 
    } 
    return id; 
} 

database picture

+0

トピックを外してください:[usingステートメント](http://www.dotnetperls.com/using)を見てください。あなたのコードをたくさん整理し、 'IDisposable'オブジェクトに' Dispose() 'を呼び出す手間を省くことができます。 –

+1

あなたのcatchブロックで 'throw err'を実行しないと、スタックトレースがリセットされます。あなたの時間を無駄にしているだけで、「スロー」するか、キャッチブロックを一掃してください。 – user1666620

+0

データベースに対してスクリプトを直接実行すると結果が返されますか? – user1666620

答えて

4

AccessデータベースでOLEDBを使用する場合は、パラメータ名は無視されます。アクセスが期待する順序でパラメーター値を指定する必要があります。あなたはAccessクエリデザイナーからこのクエリを実行すると...

SELECT [ReTweetID] FROM [ReTweet] WHERE [TweetID] = [@TID] AND [UserID] = [@UID] 

...あなたはアクセスが[@UID]ため[@TID]第1および値の値を指定するように要求されますことがわかります。

しかし、あなたのC#コードでは、逆の順序でパラメータ値を指定しています。

TweetID = 59とUserID = 1でなぜ成功したのかわからないので、問題を混乱させる何かがあるかもしれません。テーブルに実際にTweetID = 1の行が含まれていればUserID = 59です。おそらくそれはそうです。しかし、いずれにしても、Accessが期待する順序でパラメータ値を最初に提供してから、追加コードを変更する必要があるかどうかを確認することをお勧めします。

+0

ありがとう、それはアクセスがそのように働くことを知っていませんでした、そして、なぜ私は最初のパラメータで働いたのか分かりません。 – Rokni

+0

実際にアクセスが必ずしもそのように機能するわけではありません。たとえば、DAOからクエリを実行するときに、パラメータ名は意味があります。 AccessのクエリがOleDbまたは(OleDbに基づいている)ADOから実行されたときにのみ、パラメータ名が無視されると思います。 – HansUp

+0

私はOledbとADOを使っていましたが、別のパラメータで動作しましたが、それは変です。 – Rokni

関連する問題