2016-05-16 2 views
1

Я пытаюсь создать частную систему сообщений.Извлечение идентификатора только с именем пользователя

Что я до сих пор. - проверка наличия игрока с именем из текстового поля, если нет, появляется ошибка.

Теперь я пытаюсь вставить его в стол. Проблема заключается в том, что таблица имеет 2 colums

to_user_id 
from_user_id 

И becasuse Я использую текстовое поле для ввода имени пользователя, я не как получить to_user_id из таблицы пользователей, имея только имя.

это мой код

 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(); 

     } 

    } 

Конечно, я получил ошибку

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

@edit,

@cordan Я попытался это

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); 

получил эту ошибку

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

вы рассмотрели поиск пользователя из таблицы пользователей? то есть «SELECT id FROM users WHERE username = @ username», а затем используя результат этого запроса? – yaakov

+0

@codran Я не уверен, как поместить этот проверенный id в переменную, чтобы затем использовать его как 'cmd.Parameters.AddWithValue ("@ to", retrieved_id); – Harugawa

+0

SET @user = (SELECT ID FROM Users WHERE имя_пользователя = @user_name) –

ответ

1

Этот бит здесь огромный НЕТ !!

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 (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 DO, ЧТО !!


Вместо этого, вы просто должны искать для одного пользователя, вы заинтересованы в

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

Пока вы на нем, почему топ 1? предполагая, что имя пользователя должно быть уникальным, первое 1 бесполезно. также, почему «ExecuteReader», когда вы можете использовать «ExecuteScalar» и делать все в одном соединении sql вместо 2? –

+0

Добавляя к тому, что сказал Зоар, если вы собираетесь показать правильный способ сделать это, безопасно избавляйтесь от своих расходных материалов. – yaakov

Смежные вопросы