将日期时间插入和更新到SQL数据库中

4
private void ButtonOk_Click(object sender, EventArgs e)
    {
        if (txtWedstrijdSchemaID.Text == "")
        {
            //Insert
            string SQL;
            SQL = "Insert into Wedstrijdschema (Team1, Team2, Datum)";
            SQL += " values (";
            SQL += "" + txtTeam1.Text + ",";
            SQL += "" + txtTeam2.Text + ",";
            SQL += "" + Convert.ToDateTime(txtDatum.Text) + "";
            SQL += ")";

            clDatabase.ExecuteCommand(SQL);
            vulLv();
        }
        else
        {
            //Update
            string SQL;
            SQL = "Update Wedstrijdschema SET ";
            SQL += "Team1 = " + txtTeam1.Text + ",";
            SQL += "Team2 = " + txtTeam2.Text + ",";
            SQL += "Datum = " + Convert.ToDateTime(txtDatum.Text) + "";
            SQL += " where SchemaId = " + zoek;

            clDatabase.ExecuteCommand(SQL);
            vulLv();
        }
        txtDatum.Enabled = txtTeam2.Enabled = txtTeam1.Enabled = false;
    }

这是我目前拥有的内容,因为trycatch语句,当我尝试时它不会崩溃,如果我在//insert和//upload中注释掉txtDatum.Text,它可以正常工作(但显然在数据库中将输入NULL作为日期),有人能看出我哪里错了吗?
编辑:关于参数的使用,我们需要使用三层系统,所有SQL都通过一个类进行,这是唯一允许对数据库进行任何操作的类,这是命令执行的方式。
public static bool ExecuteCommand(string SQLInstructie)
        {
            bool retour = true;
            SqlConnection Conn = new SqlConnection(clStam.Connstr);
            SqlCommand Cmd = new SqlCommand(SQLInstructie, Conn);

            try
            {
                Cmd.Connection.Open();
                Cmd.ExecuteNonQuery();
            }
            catch
            {
                retour = false;
            }
            finally
            {
                Conn.Close();
            }
            return retour;
        }

这个可以用了!!非常感谢您的帮助:

private void ButtonOk_Click(object sender, EventArgs e)
        {
            if (txtWedstrijdSchemaID.Text == "")
            {
                //Insert

                string SQL;
                SQL = "Insert into Wedstrijdschema (Team1, Team2, Datum)";
                SQL += " values (";
                SQL += "" + txtTeam1.Text + ",";
                SQL += "" + txtTeam2.Text + ",";
                SQL += "'" + Convert.ToDateTime(txtDatum.Text) + "'";
                SQL += ")";
                Debug.WriteLine(SQL);
                clDatabase.ExecuteCommand(SQL);
                vulLv();
            }
            else
            {
                //Update
                string SQL;
                SQL = "Update Wedstrijdschema SET ";
                SQL += "Team1 = " + txtTeam1.Text + ",";
                SQL += "Team2 = " + txtTeam2.Text + ",";
                SQL += "Datum = '" + Convert.ToDateTime(txtDatum.Text) + "'";
                SQL += " where SchemaId = " + zoek;

                clDatabase.ExecuteCommand(SQL);
                vulLv();
            }
            txtDatum.Enabled = txtTeam2.Enabled = txtTeam1.Enabled = false;
        }

编辑:我承诺从现在开始使用参数化SQL!


3
你使用的数据库是哪一个?是SQL Server还是MySQL?这将取决于日期格式的预期。研究参数,它们比手动构建SQL字符串更好。 - Daniel Casserly
1
使用参数化语句,在文本框中输入 ' 并运行代码,看看会发生什么。 - Alex K.
3
你应该始终使用参数化查询。这种字符串拼接方式容易受到SQL注入攻击的威胁。 - Soner Gönül
1
Convert.ToDateTime(txtDatum.Text)可能不会给出正确的格式;它将变成19-6-2015 14:49:23或类似的格式(ToString()被隐式调用)。而且,由于您正在使用荷兰系统,这取决于文化设置(别担心;我也是荷兰人)。您需要知道您的数据库对字符串期望什么样的格式,并进行相应的格式调整。 - Sjips
1
clDatabase.ExecuteCommand(SQL); 之前,请添加一行 Debug.WriteLine(SQL);。检查输出窗口。SQL 是什么样子的? - Sjips
显示剩余4条评论
4个回答

6

INSERTUPDATE语句中,您缺少一个,命令。

向数据库插入数据的语法为:

 INSERT INTO Table 
        (Column1, Column2, Column3) 
 VALUES
        ('Value 1', 'Value 2', 'Value3')

此外,您容易受到SQL注入攻击,使用SQL参数化查询以防止这种情况发生。

首先,我会使用SqlCommand对象。

SqlCommand cmd = new SqlCommand("INSERT INTO Wedstrijdschema (Team1, Team2, Datum) VALUES (@V1, @V2, @V3");

cmd.Parameters.AddWithValue("@V1", txtTeam1.Text);
cmd.Parameters.AddWithValue("@V2", txtTeam2.Text);
cmd.Parameters.AddWithValue("@V3", Convert.ToDateTime(txtDatum.Text));

然后使用cmd.ExecuteNonQuery();执行它。

另外,我还会确保txtDatum中的值被正确转换为所需的日期格式。


@StrahBehry - 这是一个很好的机会来改变实现方式,在你的学校项目中展示最佳实践,希望能获得更好的评分。 - Darren
请您看一下我编辑的内容,Darren。这是我们在数据库层面上必须使用的东西。 - Strah Behry
1
@StrahBehry - 你收到错误信息了吗?程序流程是否进入catch语句? - Darren
1
@StrahBehry - catch语句告诉你什么?是日期的FormatException还是与SQL相关的问题? - Darren
1
找到了,我在SQL管理工具中尝试了debug.writeline(sql)给出的查询语句,它告诉我在0:00:00附近有一个语法错误,所以我在日期时间周围加上了引号,然后它就可以工作了。在C#代码中添加了单引号。 - Strah Behry
显示剩余2条评论

2

移除日期时间列中的单引号。同时,您错过了要添加到插入语句中的列。

private void ButtonOk_Click(object sender, EventArgs e)
        {
            if (txtWedstrijdSchemaID.Text == "")
            {
                //Insert
                string SQL;
                SQL = "Insert into Wedstrijdschema (Team1, Team2,**Datum**)";
                SQL += " values (";
                SQL += "" + txtTeam1.Text + ",";
                SQL += "" + txtTeam2.Text + "";
                SQL += "" + Convert.ToDateTime(txtDatum.Text) + "";
                SQL += ")";

                clDatabase.ExecuteCommand(SQL);
                vulLv();
            }
            else
            {
                //Update
                string SQL;
                SQL = "Update Wedstrijdschema SET ";
                SQL += "Team1 = " + txtTeam1.Text + ",";
                SQL += "Team2 = " + txtTeam2.Text + "";
                SQL += "Datum = " + Convert.ToDateTime(txtDatum.Text) + "";
                SQL += " where SchemaId = " + zoek;

                clDatabase.ExecuteCommand(SQL);
                vulLv();
            }
            txtDatum.Enabled = txtTeam2.Enabled = txtTeam1.Enabled = false;
        }

是的,我也注意到了,那是在测试时没有添加 Datum 导致的。但它还是不起作用... - Strah Behry

2

始终使用参数化查询。字符串拼接是 SQL 注入的一种方式。

private void ButtonOk_Click(object sender, EventArgs e)
{
    if (txtWedstrijdSchemaID.Text == "")
    {
    SqlCommand cmd = new SqlCommand("Insert into Wedstrijdschema (Team1, Team2, Datum)  values (@Team1,@Team2,@datetime)"); 
     cmd.Parameters.AddWithValue("@Team1",txtTeam1.Text 
     cmd.Parameters.AddWithValue("@Team2",txtTeam2.Text              
     cmd.Parameters.AddWithValue("@datetime",Convert.ToDateTime(txtDatum.Text)     
     clDatabase.ExecuteCommand(SQL);
     vulLv();
    }
    else
    {
    SqlCommand cmd = new SqlCommand("Update Wedstrijdschema SET Team1=@team1,Team2=@team2,Datum =@Datum where SchemaId=@SchemaId");
     cmd.Parameters.AddWithValue("@team1",txtTeam1.Text );
     cmd.Parameters.AddWithValue("@team2",txtTeam2.Text);              
     cmd.Parameters.AddWithValue("@Datum ",Convert.ToDateTime(txtDatum.Text);
     cmd.Parameters.AddWithValue("@SchemaId",zoek);
     clDatabase.ExecuteCommand(SQL);
     vulLv();
    }
    txtDatum.Enabled = txtTeam2.Enabled = txtTeam1.Enabled = false;
}

2

使用ToString方法将日期格式化为可接受的格式(并用引号括起来,因为它作为字符串被传递):

string SQL;
    SQL = "Insert into Wedstrijdschema (Team1, Team2, Datum)";
    SQL += " values (";
    SQL += "" + txtTeam1.Text + ",";
    SQL += "" + txtTeam2.Text + ",";
    SQL += "'" + Convert.ToDateTime(txtDatum.Text).ToString("yyyy-MM-dd HH:mm:ss") + "'";
    SQL += ")";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接