[英]Selective Xml Index causing Insert Error: string or binary data would be truncated. the statement has been terminated
[英]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。 此外,在我的過程中,我先添加到父表,然后再添加到子表,但仍然出現錯誤
插入語句與外鍵約束沖突
當您設置參數時, email
和gender
的值混合在一起,因此您實際上將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.