2016-05-16 9 views
1

Ich versuche, ein privates Nachrichtensystem zu erstellen.Abrufen der ID mit nur Benutzername

Was ich bisher habe. - Überprüfen, ob der Player mit dem Namen aus der Textbox existiert, andernfalls wird der Fehler angezeigt.

Jetzt versuche ich, es in die Tabelle einzufügen. Das Problem ist, dass die Tabelle mit 2 colums

to_user_id 
from_user_id 

Und becasuse ich eine Textbox bin mit dem Namen des Benutzers eingeben, ich nicht, wie to_user_id von den Benutzern Tabelle abzurufen, während nur Namen.

dies ist mein Code

 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connect"].ToString()); 
    conn.Open(); 
    SqlCommand cmdd = new SqlCommand(); 
    cmdd.CommandText = "select * from [users]"; 
    cmdd.Connection = conn; 

    SqlDataReader rd = cmdd.ExecuteReader(); 


    while (rd.Read()) 
    { 
     if (rd[1].ToString() == TextBox_To.Text) 
     { 
      flag = false; 
      break; 
     } 

    } 
    conn.Close(); 
    if (flag == true) 
    { 
     Label1.Visible = true; 
     Label1.Text = "User does not exist"; 

    } 
    else if(flag == false) 
    { 

     using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Connect"].ToString())) 
     { 
      SqlCommand cmd = new SqlCommand(); 

      cmd.Connection = con; 

      cmd.CommandText = @"INSERT INTO messages (message_title, message_content, to_user_id, from_user_id, message_date) 
           VALUES (@title, @content, @to, @from, @date)"; 

      cmd.Parameters.AddWithValue("@title", TextBox_Title.Text); 
      cmd.Parameters.AddWithValue("@content", TextBox_Msg.Text.Replace("\n", "<br/>")); 
      cmd.Parameters.AddWithValue("@to", TextBox_To.Text); 
      cmd.Parameters.AddWithValue("@date", DateTime.Now); 
      cmd.Parameters.AddWithValue("@from", Session["id"].ToString()); 




      con.Open(); 
      cmd.ExecuteNonQuery(); 

     } 

    } 

Natürlich habe ich einen Fehler bekam

Conversion failed when converting the nvarchar value 'username' to data type int. 

@edit,

@cordan Ich habe versucht, diese

DECLARE @user_id = (SELECT id FROM users WHERE [email protected]); 
            INSERT INTO messages (message_title, message_content, to_user_id, from_user_id, message_date) 
            VALUES (@title, @content, @user_id, @from, @date); 
       cmd.Parameters.AddWithValue("@to", TextBox_To.Text); 

diesen Fehler bekam

Incorrect syntax near '='. 
Must declare the scalar variable "@user_id". 
+2

haben Sie darüber nachgedacht aufzublicken den Benutzer aus der Benutzer-Tabelle? d. h. SELECT ID FROM Benutzer WHERE Benutzername = @ Benutzername, dann das Ergebnis dieser Abfrage verwenden? – yaakov

+0

@codran Ich bin mir nicht sicher, wie ich die ID, die nachgeschlagen wurde, in eine Variable schreiben kann, damit ich sie als 'cmd.Parameters.AddWithValue ("@ to", recovered_id) verwenden kann;' – Harugawa

+0

SET @user = (SELECT ID FROM Benutzer WHERE Benutzername = @Benutzername) –

Antwort

1

Dieses Bit hier ist ein riesiges NEIN !!

Sie wählen jeden einzelnen Benutzer aus der Benutzertabelle aus, nur um festzustellen, ob der, den Sie suchen, existiert.

Abgesehen von der Tatsache, dass man fast könnte sicherlich nur hinzufügen:

if (rd[1].ToString() == TextBox_To.Text) 
    { 
     foundUserId = (int)rd[0]; // I'm assuming the first column in users is the Id - it probably is 
     flag = false; 
     break; 
    } 

DONT das tun !!


Stattdessen sollten Sie nur für die Sie einen Benutzernamen suchen werden in

interessiert sind
SqlCommand cmdd = new SqlCommand(); 
cmdd.CommandText = "select top 1 Id from [users] where [email protected]"; 
cmdd.Parameters.AddWithValue("@username",username); 
cmdd.Connection = conn; 

SqlDataReader rd = cmdd.ExecuteReader(); 

var userId = 0; 
if(rd.Read()) 
{ 
    userId = (int)rd[0]; 
} 
conn.Close(); 
if (userId == 0) 
{ 
    Label1.Visible = true; 
    Label1.Text = "User does not exist"; 
    return; 
} 
else 
    .... // userId holds the users Id 
    ... 
    cmd.Parameters.AddWithValue("@to", userId); 
+1

Während du schon dabei bist, warum Top 1? Unter der Annahme, dass der Benutzername eindeutig sein sollte, ist Top 1 nutzlos. auch, warum 'ExecuteReader', wenn Sie' ExecuteScalar' verwenden können und die ganze Sache in einer SQL-Verbindung statt in 2 durchführen? –

+0

Fügen Sie auf das hinzu, was Zohar sagte, wenn Sie den richtigen Weg zeigen werden, entsorgen Sie bitte Ihre Verbrauchsmaterialien. – yaakov

Verwandte Themen