Как изменить хранимую процедуру или код ASP.net, чтобы получить автоматически сгенерированный идентификатор после вставки новой строки - PullRequest
1 голос
/ 30 апреля 2011

Я создаю новый модуль регистрации пользователей, и для этого я написал следующую сохраненную процедуру.

PROCEDURE [dbo].[addNewUser]
    -- Add the parameters for the stored procedure here
    @usertype VarChar(10),
    @useremail VarChar(70),
    @userpass VarChar(20),
    @fullname VarChar(70),
    @city VarChar(70),
    @state Int,
    @allowAlerts Bit,
    @allowLetter Bit,
    @aboutMe NVARCHAR(160)

As
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


   if ((select count(user_info._id) from user_info where useremail like @useremail)  =  0)
    BEGIN
        Insert Into user_info
        (usertype,useremail,userpass,fullname,city,[state],allowAlerts,allowLetters,aboutMe)
           Values
           (
                @usertype,
                @useremail,
                @userpass ,
                @fullname,
                @city,
                @state,
                @allowAlerts,
                @allowLetter,
                @aboutMe
            )
        Select @@IDENTITY as NewID  
    END
    Else
    BEGIN
         Print '-1'         
    END 

Ниже приведен простой код ASP.net C #, который я пытаюсь использовать

 public int registerNewUser(string usertype, string useremail, string userpass, string fullname, string city, string state, string allowAlerts, string allowLetter, string aboutMe)
        {
            con = new SqlConnection(connectionString);
            cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "addBlogEntry";
            cmd.Parameters.Add("@usertype", SqlDbType.VarChar).Value = usertype;
            cmd.Parameters.Add("@useremail", SqlDbType.VarChar).Value = useremail;
            cmd.Parameters.Add("@userpass", SqlDbType.VarChar).Value = userpass;
            cmd.Parameters.Add("@fullname", SqlDbType.VarChar).Value = fullname;
            cmd.Parameters.Add("@city", SqlDbType.VarChar).Value = city;
            cmd.Parameters.Add("@state", SqlDbType.VarChar).Value = Convert.ToInt16(state);
            cmd.Parameters.Add("@allowAlerts", SqlDbType.VarChar).Value = Convert.ToInt16(allowAlerts);
            cmd.Parameters.Add("@allowLetter", SqlDbType.VarChar).Value = Convert.ToInt16(allowLetter);
            cmd.Parameters.Add("@aboutMe", SqlDbType.VarChar).Value = aboutMe;
            try
            {
                if (con.State != ConnectionState.Open)
                    con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
                con.Dispose();

                // some code to be written here so that i can return userID(success) or -1(if that username is already registered)
                 return 0;
            }
            catch (Exception Ex)
            {
                con.Close();
                con.Dispose();

                return 0;
            }
        }

Через мой код C # я хочу вернуть либо автоматически сгенерированный идентификатор пользователя, который мне возвращают мои хранимые процедуры, либо, если существует пользовательский alrady, чем я хочу вернуть -1

Скажите, пожалуйста, как это сделать?

Заранее спасибо:)

Ответы [ 3 ]

2 голосов
/ 30 апреля 2011

Прежде всего, вы должны использовать SELECT SCOPE_IDENTITY() внутри вашего сохраненного процесса, чтобы получить новое значение идентификатора (@@IDENTITY может возвращать ложные результаты).

И да, если вы хотите получить результат обратно, вам нужно вызвать либо .ExecuteScalar(), либо .ExecuteReader(), а затем прочитать это значение обратно.

И пока вы это делаете - я бы также рекомендовал использовать объекты SqlConnection и SqlCommand в блоках, поэтому вместо кода используйте следующее:

using(con = new SqlConnection(connectionString))
using(cmd = new SqlCommand(con))
{
    ..... // put the rest of your code here
}
2 голосов
/ 30 апреля 2011

Да, вы можете использовать ExecuteScalar () и изменить

Print '-1'

на

Select -1 as NewID
0 голосов
/ 30 апреля 2011

Если вы хотите создать выходной параметр для вашего сохраненного процесса и установить для него новый ключ, вы можете получить к нему доступ таким образом. ExecuteNonQuery вернет количество затронутых строк, так что их также можно использовать. Как то так:

cmd.Parameters.Add("@uniquID", SqlDbType.Int).Direction = ParameterDirection.Output;

// Your other code...

var result = cmd.ExecuteNonQuery();

// Your other code...

return (result == 1) ? (int)cmd.Parameters["@uniquID"].Value : -1;
...