2013-06-05 5 views
1

У меня есть эта таблица Профиль, у которого есть поля с user_Id и regNo, и я хочу сначала проверить, если id и электронная почта уже существуют, прежде чем приступать к вставке данных.Проверка наличия id и reg уже существует

В моем коде я могу проверить только одну строку (идентификатор или номер регистра), но если я собираюсь проверить их два, это дает мне ошибку, говоря «Должен объявить скалярную переменную @ Идентификатор пользователя". Я не знаю, является ли это с моим выбором, что это неправильно или что-то в моем коде.

SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True"); 
    con.Open(); 
    SqlCommand cmdd = new SqlCommand("select * from Profile where user_Id = @userid AND RegNo = @reg", con); 

    SqlParameter param = new SqlParameter(); 
    //SqlParameter param1 = new SqlParameter(); 
    param.ParameterName = "@userid"; 
    param.ParameterName = "@reg"; 

    param.Value = txtid.Text; 
    param.Value = txtregNo.Text; 

    cmdd.Parameters.Add(param); 
    //cmdd.Parameters.Add(param1); 


    SqlDataReader reader = cmdd.ExecuteReader(); 


     if (reader.HasRows) 
     { 
      MessageBox("User Id/Registry Number already exists"); 
     } 


     else 
     { 
      SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True"); 
      SqlCommand cmd = new SqlCommand("qry", con); 
      cmd.CommandType = System.Data.CommandType.Text; 

      cmd.Parameters.AddWithValue("@id", txtid.Text); 
      cmd.Parameters.AddWithValue("@regno", txtregNo.Text); 
      cmd.Parameters.AddWithValue("@name", txtname.Text); 

      cmd.CommandType = System.Data.CommandType.StoredProcedure; 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
      MessageBox("successfully saved!"); 

     } 

Я использую C# с asp.net.

ответ

1
param.ParameterName = "@userid"; 
param.ParameterName = "@reg"; 

param.Value = txtid.Text; 
param.Value = txtregNo.Text; 

Вы только объявляя 1 параметр и перезаписывать ее как для ParameterName и Value.

В качестве альтернативы вам следует рассмотреть возможность использования какого-либо помощника по доступу к данным или ORM или что-то, что избавит вас от проблем со всем кодом кода подключения.

Вы также открываете другое соединение внутри того, что должно быть открытым соединением SQL.

0

Ваша проблема в том, что вы переназначили параметр @reg после назначения его @userid.

Попробуйте это:

SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True"); 
con.Open(); 
SqlCommand cmdd = new SqlCommand("select user_id from Profile where user_Id = @userid AND RegNo = @reg", con); 


cmdd.Parameters.AddWithValue("@userid", txtid.Text); 
cmdd.Parameters.AddWithValue("@reg", txtregNo.Text); 

var id = cmdd.ExecuteReader() as string; 

if (String.IsNullOrEmpty(id)) 
{ 
    //Show error message and exit the method 
} 
else 
{ 
    //Add the row to the database if it didn't exist 
} 

EDIT:

Я добавил код, чтобы показать, как вы могли бы проверить, если идента существует в таблице. Затем вы проверяете сам идентификатор пользователя, а не проверяете объект reader. Заметьте, я сейчас не на своем компьютере-разработчике, поэтому я не скомпилировал это, возможно, вам придется сделать некоторые настройки, но идея есть.

+0

привет спасибо за ответ. Я попробовал ваше предложение кода.Но он просто проверяет reg no, идентификатор пользователя не проверяется, он сохраняет даже идентификатор уже существует – user2388316

+0

Является ли 'id' установленным как ваш первичный ключ в таблице? –

+0

no, id не является моим основным ключом – user2388316

0

Вы используете один экземпляр sql-параметра и передаете ему два разных значения, тем самым переопределяя первый. Попробуйте так:

SqlParameter param1 = new SqlParameter("@userid", txtid.Text); 

SqlParameter param2 = new SqlParameter("@reg", txtregNo.Text); 
+0

Я попробовал и ваш код предложения. Но это просто проверка reg no, идентификатор пользователя не проверяется, он сохраняет даже идентификатор уже существует – user2388316

+0

мой пост был о вашей первой ошибке с параметрами. если по какой-то причине вы не хотите добавлять уникальный индекс в эти два поля в базе данных, вы всегда можете выполнить 'select count (1) из профиля, где user_Id = @userid AND RegNo = @ reg', если вы получите' 1 'тогда пользователь уже существует другим способом, вы можете продолжить вставку – Ted

+0

, вы можете использовать другие' SqlCommand' и 'ExecuteReader()' или 'SqlDataAdapter' и' DataSet'. проверьте этот CodeProject на странице http://www.codeproject.com/Articles/4416/Beginners-guide-to-accessing-SQL-Server-through-C – Ted

2

ОК, так что это не будет работать:

SqlParameter param = new SqlParameter(); 
//SqlParameter param1 = new SqlParameter(); 
param.ParameterName = "@userid"; 
param.ParameterName = "@reg"; 

param.Value = txtid.Text; 
param.Value = txtregNo.Text; 

cmdd.Parameters.Add(param); 

, потому что вы переназначение значение одного и того же объекта. Изменение, что это:

cmdd.Parameters.AddWithValue("@userid", txtid.Text); 
cmdd.Parameters.AddWithValue("@reg", txtregNo.Text); 

это добавит параметры, два из них, к SqlCommand объекта. Теперь немного больше советов, рассмотреть возможность сделать это:

using (SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True")) 
{ 
    con.Open(); 
    using (SqlCommand cmdd = new SqlCommand("select * from Profile where user_Id = @userid AND RegNo = @reg", con)) 
    { 
     ... 

     using (SqlDataReader reader = cmdd.ExecuteReader()) 
     { 
      ... 
     } 
    } 
} 

, потому что сейчас вы не утилизации тех объекта должным образом.

Вы видите, все, что реализует IDisposable должно быть завернуто в using заявления обеспечить метод Dispose называется на нем.

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