将两个输入分配给 SQL 表的单个列

Posted

技术标签:

【中文标题】将两个输入分配给 SQL 表的单个列【英文标题】:Assign two inputs to a single column of SQL table 【发布时间】:2021-11-02 06:11:03 【问题描述】:

我正在尝试使用一个小表单收集用户的数据并将这些数据插入到 Student 表 (db) 的列中。我可以插入除用户性别之外的所有信息,为此我使用了两个单选按钮(radioButton_maleradioButton_female)。

这是我使用的 C# 代码: 仪表板表单:

private void Btn_Register_Click(object sender, EventArgs e)

    Obj.StudentName = textBox_studentName.Text;
    Obj.Age = int.Parse(textBox_age.Text);
    Obj.Gender_m = radioButton_male.Text;
    Obj.Gender_f = radioButton_female.Text;
    Obj.Contact = int.Parse(textBox_contact.Text);

    bool success = Obj.studentAdd(Obj);
    if (success)
    
        MessageBox.Show("Saved");
    

学生班

public string StudentName  get; set; 
public int Age  get; set; 
public string Gender_m  get; set; 
public string Gender_f  get; set; 
public int Contact  get; set; 

_

public bool studentAdd(Student obj)
        
            SqlConnection conn = new SqlConnection(myconnstring);
            bool success = false;
            
            try
            
                string sql = "INSERT INTO Students(FullName, Gender, ContactNo, Age) VALUES (@FullName, @Gender, @ContactNo, @Age)";
                SqlCommand cmd = new SqlCommand(sql, conn);
                cmd.Parameters.AddWithValue("@FullName", StudentName);
                cmd.Parameters.AddWithValue("@Gender", Gender_m);
                cmd.Parameters.AddWithValue("@Gender", Gender_f);
                cmd.Parameters.AddWithValue("@ContactNo", Contact);
                cmd.Parameters.AddWithValue("@Age", Age);
                conn.Open();
                int row = cmd.ExecuteNonQuery();

                if (row > 0)
                
                    success = true;
                
                else
                
                    success = false;
                


            
            catch (Exception ex)
            
                MessageBox.Show(ex.Message);
             finally
            
                conn.Close();
            
            
            return success;
        

我知道我不能简单地将两个条目分配给单个列,但我无法使用 If Else 或任何其他方式正确设置它。希望您能提供帮助。谢谢。

【问题讨论】:

提示1:Stop using AddWithValue 提示 2:性别应该是单个列/属性,而不是多个。如果您正确使用单选按钮,它们将绑定到单个属性。 1.现在看来 SqlParameterCollection.Add 方法已经贬值了 2. 正确的使用方法是什么? cmd.Parameters.Add("@FullName", SqlDbType.VarChar, 100).Value = StudentName; - 此重载已弃用,它是设置参数及其值的首选最佳实践方式 更多提示:连接和命令对象应该在using 块中。不要在连接打开时使用 MessageBox 阻塞线程。不要将年龄存储在数据库中,您必须每年更新它,而是存储出生日期并从中计算年龄 【参考方案1】:

您可能会考虑将表格设计更改为具有名字和姓氏,将性别设置为可以表示为字符串的位,并可能通过收集他们的出生日期来计算年龄。

人物类

public class Person

    public int Id  get; set; 
    public string FirstName  get; set; 
    public string LastName  get; set; 
    public bool? Gender  get; set; 
    public string GenderType => Gender != null && Gender.Value ? "Male" : "Female";
    public DateTime? BirthDay  get; set; 
    public string PhoneNumber  get; set; 
    public override string ToString() => $"FirstName LastName";

查看数据(通常我们在应用程序中格式化)。请注意,在这种情况下计算年龄可能不准确,最好了解在运行时获取年龄而不是存储在数据库表中,因为随着时间的推移年龄将不正确。此外,电话号码采用特定格式,如果未给出该格式,则很容易失败。

SELECT Id, 
       FirstName, 
       LastName,
       CASE
           WHEN Gender = 1
           THEN 'Male'
           ELSE 'Female'
       END AS Gender, 
       FORMAT(BirthDay, 'MM/dd/yyyy') AS BirthDay, 
       CONVERT(int,ROUND(DATEDIFF(hour,BirthDay,GETDATE())/8766.0,0)) AS Age,
       SUBSTRING(phoneNumber, 1, 3) + '-' + 
       SUBSTRING(phoneNumber, 4, 3) + '-' + 
       SUBSTRING(phoneNumber, 7, 4) AS PhoneNumber
FROM dbo.People;

表格设计(列大小可以小于 NVARCHAR(MAX))

CREATE TABLE dbo.People
(Id          INT IDENTITY(1, 1) NOT NULL, 
 FirstName   NVARCHAR(MAX) NULL, 
 LastName    NVARCHAR(MAX) NULL, 
 Gender      BIT NULL, 
 BirthDay    DATETIME2(7) NULL, 
 PhoneNumber NVARCHAR(MAX) NULL, 
 CONSTRAINT PK_People PRIMARY KEY CLUSTERED(Id ASC)
)

【讨论】:

非常感谢。你能告诉我,在这种情况下,注册功能上的性别和生日会是什么样子? 见下面project【参考方案2】:

你的设计应该只保留一个单个字段来记录学生的性别:

public string StudentName  get; set; 
public int Age  get; set; 
public string Gender  get; set; 
public int Contact  get; set; 

当您从 UI 收集表单数据时,您应该分配 'M''F',具体取决于所选的单选按钮。

【讨论】:

以上是关于将两个输入分配给 SQL 表的单个列的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 将多个 SQL 列组合成 HTML 表的单个列

在单个列中使用来自多个表的 ID

如何将两个HTML表的输出组合成单个列和一些列

如何将多个输入传递到单个查询中?

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来

从单个df中提取列信息并输入到标识符需要重新映射的多个dfs