2016-05-02 14 views
0

私は自分のウェブサイト用の基本的な内部メッセージングシステムを作成しようとしています。メッセージテーブルに新しい行を挿入することができますが、メッセージのsellerID(itemsupdateテーブルのuserID)はitemsupdateテーブルの最初の行の値を返します。私のSQL文はデータベースから最初の行を読み込みます

私はuserID値をsellerIDフィールドに挿入します。

string message = messagebox.Text; 
string itemid = Request.QueryString["itemID"]; 
string finduser = Session["ID"].ToString(); 

//comunicate to the web server 
string connectionString = WebConfigurationManager.ConnectionStrings["itemsconnection"].ConnectionString; 
SqlConnection myConnection = new SqlConnection(connectionString); 

// myConnection.ConnectionString is now set to connectionString. 

myConnection.Open(); 
string messages = "SELECT userID FROM itemsupdate INNER JOIN users ON itemsupdate.userID = users.ID"; 
SqlCommand command = new SqlCommand(messages, myConnection); 
int sellerid = Convert.ToInt32(command.ExecuteScalar().ToString()); 

//add the above variables to the table 'comments6' 
string query = "INSERT INTO messages(message, buyerID, sellerID, itemID) VALUES(@message, @finduser, @sellerid, @itemid)"; 
SqlCommand myCommand = new SqlCommand(query, myConnection); 
//create a parameterised object 
myCommand.Parameters.AddWithValue("@finduser", finduser); 
myCommand.Parameters.AddWithValue("@sellerid", sellerid); 
myCommand.Parameters.AddWithValue("@itemid", itemid); 
myCommand.Parameters.AddWithValue("@message", message); 
myCommand.ExecuteNonQuery(); 
myConnection.Close(); 

エラーメッセージは表示されません。どんな助けでも本当に感謝しています。私はSQLとStackOverflowについても比較的新しいので、初心者にも出くわします。

+1

'command.ExecuteScalar()'は、select文に基づいて最初の行のみを返します。 – t0mm13b

+0

Ok @ t0mm13b、どうすれば修正できますか? –

+0

'itemsupdate'テーブルを' userID'のためにループしようとしていますか?あなたのSQLは意味をなさないし、あなたの質問も明確ではない、 'itemsupdate'テーブル内の1人の売り手のためにいくつの行があるのか​​。 – t0mm13b

答えて

1

それはあなたの問題のように見えますが、あなたの最初のクエリである:t0mm13b @

SELECT userID 
FROM itemsupdate 
INNER JOIN users ON itemsupdate.userID = users.ID 

[OK]を、私はこの問題を解決するだろうか?

userIdでフィルタリングするものは何もありません。ExecuteScalarを実行しているため、返された最初の行だけを取得しています。あなたがアイテム3を購入し、販売者を必要とする、クエリで返された最初の行をつかんでいた場合

itemId sellerId 
1   1 
2   1 
3   2 

:あなたはおそらく句それを考える

where itemId = @itemid // from your queryString param? 

のようなこのような方法で追加する必要があります以下のようになります:

select sellerId 
from table 

は、1または2を返すことができます。指定した項目に限定されません。あなたが特定の行を選択するには、その文ではありませんWHERE句を持っているあなたのSELECT statement: SELECT userID FROM itemsupdate INNER JOIN...

select sellerId 
from table 
where itemId = 3 
0

ルック:あなたはこの代わりにしたいと思います。したがって、他に何が起こっても、SELECTは常に結合のすべての行を返します。また、ExecuteScalarを要求しているので、最初の行の最初の列の値を取得しています。

ロジックを考えてみましょう。これは、「バグ」(ロジックミス)であり、コーディング/構文/言語エラーではありません。論理ミスは例外を発生させません。

関連する問題