【问题标题】:Writing records to a database and only the first character of each field is entered将记录写入数据库,并且只输入每个字段的第一个字符
【发布时间】:2014-09-29 10:52:41
【问题描述】:

我已将 2 条记录写入数据库。第一条记录是用 SSMS 编写的,显示效果很好。第二条记录是使用 VS 中的存储过程调用编写的,该记录仅显示每个字段的第一个字母。第二条记录中唯一正确显示的字段是日期字段。所有列都存在。

在单击按钮时调用存储过程,并通过具有 create 方法的类的接口运行。

我在 create 方法上放了一个断点,所有从文本框传入的值都是它们应该是的值。

显然有些地方不太对劲,我似乎无法找到哪里出错了。 对不起,如果这有点冗长,但任何帮助将不胜感激!

第一条记录的 SQL INSERT

INSERT INTO Employees(Employee_ID, Full_Name, Date_Of_Birth, Home_Email, Work_Email, Work_Phone_Ext, Work_Phone, Home_Phone, Date_Started, Manager_ID, Client_Dept, Client_Start_Date, Client_Manager_Name, Leaver, Leave_Date, Contact_Person_Name, Contact_Person_Phone) 
VALUES(0, 'Test Person1', '1982-07-05', 'test1@hometest.com', 'test1@worktest.com', '01234', '654789', '01234567891', '2006-06-15', 0, 'Test Dept', '2006-06-30', 'Dave Davidson', 'No', NULL, 'Test Cp', '085219874561')

第二条记录的 SQL 存储过程

CREATE PROCEDURE Create_Employee_Personal_Details @full_name VARCHAR,
@dob DATE, @home_email VARCHAR, @work_email VARCHAR, @work_ext VARCHAR, @work_phone VARCHAR,
@home_phone VARCHAR, @start_date DATE, @manager_ID INT, @client_dept VARCHAR, 
@client_start_date DATE, @client_manager VARCHAR, @leaver VARCHAR, @leave_date DATE,
@contact_person VARCHAR, @contact_person_phone VARCHAR OUTPUT AS

DECLARE @employee_id INT

INSERT INTO Employees(Full_Name, Date_Of_Birth, Home_Email, Work_Email, Work_Phone_Ext, Work_Phone, Home_Phone, Date_Started, Manager_ID, Client_Dept, Client_Start_Date, Client_Manager_Name, Leaver, Leave_Date, Contact_Person_Name, Contact_Person_Phone)
VALUES (@full_name, @dob, @home_email, @work_email, @work_ext, @work_phone, @home_phone,
        @start_date, @manager_ID, @client_dept, @client_start_date, @client_manager,
         @leaver, @leave_date, @contact_person, @contact_person_phone)

SELECT @employee_id = MAX(Employees.Employee_ID)
FROM Employees

RETURN @employee_id

调用存储过程

employeeID = employeeDataAccessor.Create(tbFullName, tbDob, tbHomeEmail, tbWorkEmail, tbWorkPhoneExt, tbWorkPhone,
            tbHomePhone, tbStartDate, managerID, tbClientDept, tbDateStartedClient, tbClientManager, methods.Leaver(rbYes, rbNo),
                tbDateOfLeave, tbContactPerson, tbContactPersonPhone);

创建方法

public int Create(TextBox fullName, TextBox dob, TextBox homeEmail, TextBox workEmail,
        TextBox workPhoneExt, TextBox workPhone, TextBox homePhone, TextBox startDate, int managerID, TextBox clientDept,
            TextBox dateStartedClient, TextBox clientManager, string yesNo,TextBox dateOfLeave, TextBox contactPerson, TextBox cpPhoneNo)
{
    var connection = new SqlConnection();
    connection.ConnectionString = connectionString;
    connection.Open();

    var cmdIntoEmployees = new SqlCommand("EmployeeSystemProject.dbo.Create_Employee_Personal_Details", connection);
    cmdIntoEmployees.CommandType = CommandType.StoredProcedure;
    cmdIntoEmployees.Parameters.AddWithValue("@full_name", fullName.Text);
    cmdIntoEmployees.Parameters.AddWithValue("@dob", Convert.ToDateTime(dob.Text));
    cmdIntoEmployees.Parameters.AddWithValue("@home_email", homeEmail.Text);
    cmdIntoEmployees.Parameters.AddWithValue("@work_email", workEmail.Text);
    cmdIntoEmployees.Parameters.AddWithValue("@work_ext", workPhoneExt.Text);
    cmdIntoEmployees.Parameters.AddWithValue("@work_phone", workPhone.Text);
    cmdIntoEmployees.Parameters.AddWithValue("@home_phone", homePhone.Text);
    cmdIntoEmployees.Parameters.AddWithValue("@start_date", Convert.ToDateTime(startDate.Text));
    cmdIntoEmployees.Parameters.AddWithValue("@manager_ID", managerID);
    cmdIntoEmployees.Parameters.AddWithValue("@client_dept", clientDept.Text);
    cmdIntoEmployees.Parameters.AddWithValue("@client_start_date", Convert.ToDateTime(dateStartedClient.Text));
    cmdIntoEmployees.Parameters.AddWithValue("@client_manager", clientManager.Text);
    cmdIntoEmployees.Parameters.AddWithValue("@leaver", yesNo);

    if (string.IsNullOrWhiteSpace(dateOfLeave.Text) == false)
    {
        cmdIntoEmployees.Parameters.AddWithValue("@leave_date", Convert.ToDateTime(dateOfLeave.Text));
    }
    else
    {
        cmdIntoEmployees.Parameters.AddWithValue("@leave_date", DBNull.Value);
    }

    cmdIntoEmployees.Parameters.AddWithValue("@contact_person", contactPerson.Text);
    cmdIntoEmployees.Parameters.AddWithValue("@contact_person_phone", cpPhoneNo.Text);

    employeeID = Convert.ToInt32(cmdIntoEmployees.ExecuteScalar());

    return employeeID;
}

【问题讨论】:

    标签: c# sql sql-server winforms stored-procedures


    【解决方案1】:

    您尚未在存储过程中指定参数的长度:

    @home_phone VARCHAR,
    

    这将认为@home_phone 参数的默认长度为1。所以当你传递一个像1-123-456-7890 这样的值时,它只会将第一个字符视为输入的一部分,其余的值将被截断。这就是为什么您在字段中只能看到一个字符。根据表中的字段大小指定您的长度。例如,如果您的字段home_phone 的大小为14,则在存储过程中指定与您的参数相同的长度。

    @home_phone VARCHAR(14)
    

    见:char and varchar (Transact-SQL)

    当 n 未在数据定义或变量声明中指定时 语句,默认长度为1。当不指定n时 使用 CAST 和 CONVERT 函数,默认长度为 30。

    【讨论】:

    • 非常快!在这里也 +1
    猜你喜欢
    • 2019-08-22
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2017-11-03
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多