2016-05-17 9 views
1

Ich habe einen einfachen SQL-Befehl, der nicht in bestimmten geben Parameter funktionieren wird.
Zum Beispiel wenn TweetID = 59 und UserID = 1 wird es den Wert zurückgeben;
aber wenn TweetID = 8 und UserID = 1 wird es nicht den Wert zurückgeben.
Kann jemand den Grund dafür finden?Simple SQL-Befehl wird nicht an bestimmten Parametern arbeiten

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

Off-Thema: in die [using-Anweisung] (http://www.dotnetperls.com/using) schauen. Es könnte Ihren Code viel aufräumen und den Aufwand für den Aufruf von 'Dispose()' auf 'IDisposable' Objekten ersparen. –

+1

"Werfen Sie keinen Fehler" in Ihren catch-Block, da dies den Stacktrace zurücksetzt. Entweder einfach einen "Wurf" machen oder den Fangblock ganz loswerden, da Sie Ihre Zeit verschwenden. – user1666620

+0

Wenn Sie das Skript direkt für die Datenbank ausführen, gibt es Ergebnisse zurück? – user1666620

Antwort

4

Bei der Verwendung von OleDb mit einer Access-Datenbank, Parameternamen ignoriert. Sie müssen die Parameterwerte in der Reihenfolge bereitstellen, in der Access erwartet. Wenn Sie diese Abfrage aus dem Access-Abfrage-Designer laufen ...

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

... Sie werden sehen, dass Access fragen Sie nach [@UID] einen Wert für [@TID] zuerst und dann einen Wert zu liefern.

Aber in Ihrem C# -Code liefern Sie die Parameterwerte in umgekehrter Reihenfolge.

Es kann jedoch etwas anderes sein, das das Problem verwirrt, weil ich nicht sehe, warum es mit TweetID = 59 und UserID = 1 gelang. Das würde nur Sinn ergeben, wenn die Tabelle tatsächlich eine Zeile mit TweetID = 1 enthält und UserID = 59. Und vielleicht tut es das. Wie auch immer, ich fordere Sie auf, zuerst die Parameterwerte in der Reihenfolge einzugeben, in der Access erwartet, und dann zu sehen, ob Sie zusätzliche Codeänderungen vornehmen müssen.

+0

Vielen Dank, es funktioniert nicht wusste, dass der Zugriff funktioniert so, und ich weiß auch nicht, warum es mit den ersten Parametern funktionierte. – Rokni

+0

Tatsächlich funktioniert Access nicht immer so. Zum Beispiel sind die Parameternamen aussagekräftig, wenn eine Abfrage von DAO ausgeführt wird. Ich denke, die Parameternamen werden nur ignoriert, wenn eine Access-Abfrage von OleDb oder von ADO (das auf OleDb basiert) ausgeführt wird. – HansUp

+0

Ich habe Oledb und ADO benutzt, aber es hat mit einem anderen Parametersatz funktioniert und das ist komisch. – Rokni