将记录写入数据库,只输入每个字段的第一个字符

Sup*_*t21 2 c# sql sql-server stored-procedures winforms

我已经将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')
Run Code Online (Sandbox Code Playgroud)

第二条记录的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
Run Code Online (Sandbox Code Playgroud)

要求存储过程

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

创建方法

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;
}
Run Code Online (Sandbox Code Playgroud)

Hab*_*bib 5

您没有在存储过程中为参数指定长度:

@home_phone VARCHAR,
Run Code Online (Sandbox Code Playgroud)

这将考虑@home_phone参数的默认长度为1.因此,当您传递它时,类似的值1-123-456-7890只会将第一个字符视为输入的一部分,其余的值将被截断.这就是为什么你只在字段中看到一个字符.根据表格中的字段大小指定长度.例如,如果您的字段home_phone的大小为,14则在"存储过程"中使用您的参数指定相同的长度.

@home_phone VARCHAR(14)
Run Code Online (Sandbox Code Playgroud)

请参阅:char和varchar(Transact-SQL)

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

  • 很快!这里也是+1 (2认同)
  • 谢谢!这非常有效=) (2认同)