簡體   English   中英

SQL 服務器錯誤 c# 字符串或二進制數據將被截斷。 插入語句與外鍵沖突

[英]SQL Server error in c# string or binary data will be truncated. insert statement conflict with foreign key

create table [User]
(
    userId int IDENTITY(1,1) primary key ,
    UserName nvarchar(30) unique,
    gender nvarchar(2),
    check( gender in ('M','F')),
    email nvarchar(40),
    DOB date
)

create table User_Auth
(
    uName nvarchar(30),
        foreign key (uName) references [User](UserName),
    pass nvarchar(30)
)

ALTER PROCEDURE [dbo].[CHECKREGISTERCREDENTIALSFORUSER]
    @USRNAME NVARCHAR(30),
    @DATE_OF_BIRTH DATE,
    @EMAIL NVARCHAR(50),
    @PASSWORD NVARCHAR(50),
    @GENDER NVARCHAR(5),
    @enterflag int output
AS
BEGIN
    SET @enterflag = 0;

    IF NOT EXISTS (SELECT UserName FROM [User] u WHERE u.UserName = @USRNAME)
    BEGIN
        IF (@DATE_OF_BIRTH <= GETDATE())
        BEGIN
            INSERT INTO [User] (UserName, gender, email, DOB) 
            VALUES (@USRNAME, @GENDER, @EMAIL, @DATE_OF_BIRTH)

            INSERT INTO [User_Auth] (uName, pass) 
            VALUES (@USRNAME, @PASSWORD)

            SET @enterflag = 1;
        END
        ELSE
        BEGIN
            PRINT 'invalid birth date entered';
        END
    END
    ELSE
    BEGIN
        PRINT 'username is taken';
    END
END

public static int Signup(string uname, string password, DateTime DOB, string email, string genders)
{
    SqlConnection con = new SqlConnection(connectionString);
    con.Open();

    SqlCommand cmd;
    int result = 0;

    try
    {
        if (con != null && con.State == ConnectionState.Open)
        {
            cmd = new SqlCommand("CHECKREGISTERCREDENTIALSFORUSER", con);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.Add("@USRNAME", SqlDbType.NVarChar, 30).Value = uname;
            cmd.Parameters.Add("@PASSWORD", SqlDbType.NVarChar, 50).Value = password;
            cmd.Parameters.Add("@DATE_OF_BIRTH", SqlDbType.Date).Value = DOB;
            cmd.Parameters.Add("@GENDER", SqlDbType.NVarChar, 5).Value = email;
            cmd.Parameters.Add("@EMAIL", SqlDbType.NVarChar, 50).Value = genders;
            cmd.Parameters.Add("@enterflag", SqlDbType.Int).Direction = ParameterDirection.Output;

            cmd.ExecuteNonQuery();

            result = Convert.ToInt32(cmd.Parameters["@enterflag"].Value);
        }
    }
    catch (SqlException ex)
    {
        Console.WriteLine("SQL Error" + ex.Message.ToString());
        result = -1; //-1 will be interpreted as "error while connecting with the database."
    }
    finally
    {
        con.Close();
    }

    return result;
}

這是 C# 代碼 - 我不知道出了什么問題 - 我收到錯誤消息。 過程參數中沒有越界輸入。 存儲過程中參數的大小與用代碼編寫的相同。 如果注冊成功,它應該返回 1。 此外,在我的過程中,我先添加到父表,然后再添加到子表,但仍然出現錯誤

插入語句與外鍵約束沖突

當您設置參數時, emailgender的值混合在一起,因此您實際上將email值設置為數據庫中的gender ,反之亦然。

cmd.Parameters.Add("@GENDER", SqlDbType.NVarChar, 5).Value = email;
cmd.Parameters.Add("@EMAIL", SqlDbType.NVarChar, 50).Value = genders;

應該

cmd.Parameters.Add("@GENDER", SqlDbType.NVarChar, 5).Value = genders;
cmd.Parameters.Add("@EMAIL", SqlDbType.NVarChar, 50).Value = email;

此外,在User表中, gender定義為長度為 2,但在存儲過程中,它被聲明為長度 5。然而,您使用check (gender in ('M', 'F')) ,它是單個字符。

如果您只接受一個字符作為gender ,您可以更新User表定義和存儲過程以接受一個 char 作為gender

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM