【问题标题】:C# data storing cut the inputsC# 数据存储切割输入
【发布时间】:2021-10-09 05:08:46
【问题描述】:

我有将表单输入存储到数据库的功能,但问题是它在存储它们时将所有输入截断为单个字母。

例如:如果我写 Tom 的名称,它只保存 t。我的表单中的所有输入都会发生这种情况。

Code

try
{
    using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MYAPPDatabaseString"].ConnectionString))
    {
        if (cn.State == ConnectionState.Closed)
            cn.Open();
        using (SqlCommand cmd = new SqlCommand("dbo.InsertUser", cn))
        {
            if (nameInput.Text != "" && passwordLableG.Text != "" && usernameLableG.Text != "")
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@UserType", typeLAbleG.SelectedItem); // <-- only stores first letter of input
                cmd.Parameters.AddWithValue("@Name", nameInput.Text); // <-- only stores first letter of input
                cmd.Parameters.AddWithValue("@Password", passwordLableG.Text); // <-- only stores first letter of input
                cmd.Parameters.AddWithValue("@UserName", usernameLableG.Text); // <-- only stores first letter of input
                cmd.Parameters.AddWithValue("@Phone", phoneLableG.Text); // <-- only stores first letter of input
                cmd.Parameters.AddWithValue("@IdCard", idCardLableG.Text); // <-- only stores first letter of input
                cmd.ExecuteNonQuery();
                cn.Close();
                MessageBox.Show("Successfully Saved");
            }
        }
    }
}
catch (SqlException ex)
{
    StringBuilder errorMessages = new StringBuilder();
    for (int i = 0; i < ex.Errors.Count; i++)
    {
        errorMessages.Append("Index #" + i + "\n" +
            "Message: " + ex.Errors[i].Message + "\n" +
            "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
            "Source: " + ex.Errors[i].Source + "\n" +
            "Procedure: " + ex.Errors[i].Procedure + "\n");
    }
    Console.WriteLine(errorMessages.ToString());
}

这是我的Stored Procedure

CREATE PROCEDURE [dbo].[InsertUser]
    @Name VARCHAR,
    @UserType VARCHAR,
    @Password VARCHAR,
    @UserName VARCHAR,
    @Phone VARCHAR = null,
    @IdCard VARCHAR = null
AS
    begin
    INSERT into Users(Name, UserType, Password, UserName, Phone, IdCard) values (@Name,@UserType,@Password,@UserName, @Phone, @IdCard);
    end

这是我的table schema

CREATE TABLE [dbo].[Users] (
    [Id]       INT           IDENTITY (1, 1) NOT NULL,
    [UserType] VARCHAR (100) NOT NULL,
    [Name]     VARCHAR (100) NOT NULL,
    [Password] VARCHAR (100) NOT NULL,
    [UserName] VARCHAR (100) NOT NULL,
    [Phone]    VARCHAR (100) NULL,
    [IdCard]   VARCHAR (100) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

有什么想法吗?

【问题讨论】:

  • 也许您存储过程的输入参数应该是 varchar(100) 而不仅仅是 varchar。
  • 是的,我发布后就看到了。
  • 我会选择下面的答案。
  • @David.Warwick 不幸的是,将 (100) 添加到我的程序中并没有解决问题。
  • @David.Warwick 下面的答案是修复我刚刚在调试文件中制作的代码:D 谢谢

标签: c# sql winforms stored-procedures


【解决方案1】:

您需要调整存储过程变量的长度以与表匹配。

    CREATE PROCEDURE [dbo].[InsertUser]
        @Name VARCHAR(100),
        @UserType VARCHAR(100),
        @Password VARCHAR(100),
        @UserName VARCHAR(100),
        @Phone VARCHAR(100) = null,
        @IdCard VARCHAR(100) = null
    AS
        begin
        INSERT into Users(Name, UserType, Password, UserName, Phone, IdCard) values (@Name,@UserType,@Password,@UserName, @Phone, @IdCard);
        end

   using (SqlCommand cmd = new SqlCommand("dbo.InsertUser", cn))
    {
        if (nameInput.Text != "" && passwordLableG.Text != "" && usernameLableG.Text != "")
        {
            cmd.Parameters.Add("@UserType", SqlDbType.VarChar).Value = typeLAbleG.SelectedItem;             
            cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = nameInput.Text;              
            cmd.Parameters.Add("@Password", SqlDbType.VarChar).Value = passwordLableG.Text;             
            cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = usernameLableG.Text;             
            cmd.Parameters.Add("@Phone", SqlDbType.VarChar).Value = phoneLableG.Text;               
            cmd.Parameters.Add("@IdCard", SqlDbType.VarChar).Value = idCardLableG.Tex;              
            cmd.ExecuteNonQuery();
            cn.Close();
            MessageBox.Show("Successfully Saved");
        }
    }

【讨论】:

  • 嗯,这很奇怪。您是否设置了断点来检查传递给命令的参数?
  • 谢谢,它有效,我的第一次尝试是调试数据库文件,该文件在运行时被删除:D
  • 您是否尝试过为存储过程中的变量显式设置适当的值并从 ssm 执行插入查询?当你这样做时,表格中会插入什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2019-05-15
相关资源
最近更新 更多