C#使用switch case将值插入数据库

C#使用switch case将值插入数据库,c#,C#,我试图使用开关盒将值插入数据库。在某些情况下,可能需要为特定情况插入多个值。我无法插入与案例对应的两个值 foreach (int thisColor in allColors) { List<Subject> subjectsForThisColor = subjects.Where(x => x.Color == thisColor).ToList(); foreach (Subject s in subjectsForThisColor) {

我试图使用开关盒将值插入数据库。在某些情况下,可能需要为特定情况插入多个值。我无法插入与案例对应的两个值

foreach (int thisColor in allColors)
{
    List<Subject> subjectsForThisColor = subjects.Where(x => x.Color == thisColor).ToList();
    foreach (Subject s in subjectsForThisColor)
    {
        test += s.SubjectName + " -" + s.Color + "\n";
        switch (s.Color)
        {
            case 1:
                con.Open();
                SqlCommand cmd = new SqlCommand("INSERT INTO Monday (first) values (@first)",con);
                cmd.Parameters.AddWithValue("first",s.SubjectName);
                cmd.ExecuteNonQuery();
                con.Close();
                break;
            case 2:
                con.Open();
                SqlCommand cmd1 = new SqlCommand("UPDATE  Monday set [second] = @second", con);
                cmd1.Parameters.AddWithValue("second", s.SubjectName);
                cmd1.ExecuteNonQuery();
                con.Close();
                break;
            case 6:
                con.Open();
                SqlCommand cmd6 = new SqlCommand("UPDATE  Monday set [sixth] = @sixth", con);
                cmd6.Parameters.AddWithValue("sixth", s.SubjectName);
                cmd6.ExecuteNonQuery();
                con.Close();
                break;
        }
    }
}

因此,当我遇到案例6时,我需要插入值
optional-2
optional-5
。现在我只能插入可选-5。

我将使用带有可选参数的存储过程。

让我们先清理一下代码,使其更易于重用:

foreach (int thisColor in allColors)
{
    List<Subject> subjectsForThisColor = subjects.Where(x => x.Color == thisColor).ToList();
    foreach (Subject s in subjectsForThisColor)
    {
        test += s.SubjectName + " -" + s.Color + "\n";
        switch (s.Color)
        {
            case 1:
                updateOneRow("Monday", "first", s.SubjectName, null);
                break;
            case 2:
                updateOneRow("Monday", "second", s.SubjectName, null);
                break;
            case 6:
                updateOneRow("Monday", "sixth", s.SubjectName, null);
                break;
        }
    }
}
这将有助于清理您的代码,至于您为什么会获得
optional-5
,这是因为您在案例6中使用了
UPDATE
SQL语句,而不是
INSERT
。Update将覆盖表中以前的值,并替换与where子句匹配的所有当前值,而您没有where子句。因此,表中的所有值都将被覆盖。我认为你应该写
INSERT
,而不是
UPDATE

[编辑] 我不喜欢它,但更新了代码以满足您的期望。您可能需要对其进行调试,但应该给出想法。它检查行是否已经存在,如果不存在,则执行插入。如果存在,则检查列中是否有值,如果存在,则将其添加到要插入的新值中。然后它进行更新

希望有帮助

最终警告 这段代码远不是完美的,但我希望它将引导您朝着正确的方向进行一些稍微更好的编码实践。祝你好运 此外,这并不是数据库的最佳设计,您应该以不同的方式进行设计

[OP的代码]

case 6:
                            con.Open();
                            string query = "SELECT count (  sixth  ) FROM  Monday  ";
                            SqlCommand cmd3 = new SqlCommand(query, con);
                            Int32 count = (Int32)cmd3.ExecuteScalar();
                            if (count == 0)
                            {
                                cmd = new SqlCommand("INSERT INTO Monday (sixth) values (@value)", con);

                            }
                            else
                            {
                                query = "SELECT top 1 sixth FROM Monday";
                                cmd = new SqlCommand(query, con);
                                string dbValue = (string)cmd.ExecuteScalar();
                                if (dbValue != null && dbValue != string.Empty)
                                {
                                    value += ";" + dbValue;
                                    //value += s.SubjectName;
                                    //cmd = new SqlCommand("UPDATE  Monday set [sixth] = @value", con); <-This is in the wrong place

                                }
                                cmd = new SqlCommand("UPDATE  Monday set [sixth] = @value", con);//Should be here
                            }
                            cmd.Parameters.AddWithValue("value",value);
                            cmd.ExecuteNonQuery();
                            con.Close();
                            break;

你应该从在代码中使用方法开始,而不是制作大量重复的代码。我不理解这个问题,但这段代码很糟糕。你为什么需要这些重复的代码?当然。这种情况发生在您身上,因为在案例6中,您没有插入,而是在更新。因此,如果首先用
optional-2
更新值,然后用
optional-5
@ZoharPeled更新值,我知道存在重复代码。我不知道如何用有效的逻辑来解决我的问题。我的问题是:我需要在表中插入一组值。这些值基于颜色值。假设我遇到的颜色为1,我需要插入与之对应的主题,即C#。类似地,当我遇到颜色6时,我需要使用optional-2和optional-5插入/更新表。希望我解释得更好。好的,最后一次尝试。在案例1中,您插入一条记录,其中主题名为
C
,然后在案例2中,您将该值更改为
SSM
。然后你会发现2个案例6。在第一个示例中,您将该值更改为
optional-2
,在第二个示例中更改为
optional-6
,请您举例说明,因为我没有使用存储过程?作为注释比answer@Thorarins,有没有办法用当前的逻辑来实现这一点?@Hexadron,您可以提供一些代码示例,并解释为什么存储过程有助于解决问题。注意到您在一种情况下使用insert语句,在另一种情况下使用update,UPDATING我不想使用第二条insert语句,因为在开始时,值为null,我只想更新null值。我也不想使用多个语句,因为对于未来的操作,我只需要表中的一行数据。我基本上想知道,如果一个案例中遇到多个SubjectName,如何插入SubjectName(如案例6和案例8所示)那么您希望表中只有一行,但希望特定值多次出现?我觉得你在用一种有点糟糕的方式制作表格,如果你有3个值需要插入,你会怎么做?无法通过编程增加列数,是否希望在同一单元格中用逗号分隔?为什么这张表中只需要一行?在第一条语句中,如果多次重新运行此代码,将得到多行
public void updateOneRow(string tableName, string columnName, string value){        
    con.Open();
    query = "SELECT count ("+columnName+") FROM "+tableName;
    SqlCommand cmd = New SqlCommand(query, con);
    Int32 count = (Int32)cmd.ExecuteScalar();
    if(count == 0){
        cmd = new SqlCommand("INSERT INTO " + tableName + "("+columnName+") values (@value)"),con);
    }
    else{
        query = "SELECT top 1 "+columnName+" FROM "+tableName;
        cmd = New SqlCommand(query, con);
        string dbValue = (string)cmd.ExecuteScalar();
        if (dbValue != null && dbValue != string.Empty)
            value += ";"+dbValue;
        cmd = new SqlCommand("UPDATE  " + tableName + " set ["+columnName+"] = @value", con);
    }
    cmd.Parameters.AddWithValue("value",value);
    cmd.ExecuteNonQuery();
    con.Close();
}
case 6:
                            con.Open();
                            string query = "SELECT count (  sixth  ) FROM  Monday  ";
                            SqlCommand cmd3 = new SqlCommand(query, con);
                            Int32 count = (Int32)cmd3.ExecuteScalar();
                            if (count == 0)
                            {
                                cmd = new SqlCommand("INSERT INTO Monday (sixth) values (@value)", con);

                            }
                            else
                            {
                                query = "SELECT top 1 sixth FROM Monday";
                                cmd = new SqlCommand(query, con);
                                string dbValue = (string)cmd.ExecuteScalar();
                                if (dbValue != null && dbValue != string.Empty)
                                {
                                    value += ";" + dbValue;
                                    //value += s.SubjectName;
                                    //cmd = new SqlCommand("UPDATE  Monday set [sixth] = @value", con); <-This is in the wrong place

                                }
                                cmd = new SqlCommand("UPDATE  Monday set [sixth] = @value", con);//Should be here
                            }
                            cmd.Parameters.AddWithValue("value",value);
                            cmd.ExecuteNonQuery();
                            con.Close();
                            break;
The parameterized query '(@value nvarchar(4000))INSERT INTO Monday (sixth) values (@value' expects the parameter '@value', which was not supplied.