使用C#执行SQL查询

4

我想向我的数据库添加一些信息。我搜索了一些教程,但它们都不起作用。

NonQuery可以完成他需要做的事情,因为消息框返回“成功”(1)。但它没有更新我的数据库。如果我将相同的查询放到“添加新查询”中,直接放到我的数据库中,它就可以工作。

有人能帮帮我吗?

我目前的类代码:

namespace BurnThatFat
{
    class databaseconnection
    {
        //fields
        SqlConnection connection;
        string connectionstring;

        public databaseconnection()
        {
            // fields waarde toewijzen
            connectionstring = @"Data Source=(LocalDB)\MSSQLLocalDB;" +
                @"AttachDbFilename=|DataDirectory|\Database2.mdf;Integrated Security=True";
            connection = new SqlConnection(connectionstring);
            OpenConnection();
            CloseConnection();
        }

        public List<Object> getObjectsFromDatabase()
        {
            try
            {
                OpenConnection();
                // sql query
                // Datareader
                // sqlcommand
                // return list van objecten , objecten veranderd naar jouw wens van data.
                CloseConnection();
            }
            catch (Exception)
            {
                throw;
            }
            return new List<object>();
        }

        private bool OpenConnection()
        {
            try
            {
                connection.Open();
                return true;
            }
            catch (MySqlException ex)
            {
                switch (ex.Number)
                {
                    case 0:
                        MessageBox.Show("Cannot connect to server.  Contact administrator");
                        break;
                    case 1045:
                        MessageBox.Show("Invalid username/password, please try again");
                        break;
                }
                return false;
            }
        }

        private bool CloseConnection()
        {
            try
            {
                connection.Close();
                return true;
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
        }

        public void AddGebruiker()
        {
            string query = "insert into Gebruiker VALUES(3, 'Cihan', 'Kurt', 18, 'Man', 85, 75, 'Admin1', 'Test123', 'testen');";
            using (connection)
            {
                SqlCommand command = new SqlCommand(query, connection);
                OpenConnection();
                int resultaat = command.ExecuteNonQuery();
                if (resultaat == 1)
                {
                    MessageBox.Show("succes");
                }
                else
                {
                    MessageBox.Show("fail");
                }
            }
        }
    }
}

编辑:
这是我按钮等的代码:
   using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

// voor sql connectie.
using System.Data.SqlClient;



namespace BurnThatFat
{
    public partial class SignUp : Form
    {

        databaseconnection db = new databaseconnection();

        public SignUp()
        {
            InitializeComponent();
            gb_login.Visible = false;
            gb_Voornaam.Visible = false;
            gb_Achternaam.Visible = false;
            gb_leeftijdgeslacht.Visible = false;
            gb_gewicht.Visible = false;
            gb_email.Visible = false;
            gb_Start.Visible = true;


        }


        private void btn_SignUp_Click(object sender, EventArgs e)
        {
            gb_Start.Visible = false;
            gb_Voornaam.Visible = true;
        }

        private void btn_login_Click(object sender, EventArgs e)
        {
            gb_Start.Visible = false;
            gb_login.Visible = true;
        }

        private void btn_loginvolgende_Click(object sender, EventArgs e)
        {
            gb_login.Visible = false;
            // hier moet nog een GB!!!!!!
        }

        private void btn_voornaamvolgende_Click(object sender, EventArgs e)
        {


            gb_Voornaam.Visible = false;
            gb_Achternaam.Visible = true;
        }

        private void btn_achternaamvolgende_Click(object sender, EventArgs e)
        {
            gb_Achternaam.Visible = false;
            gb_leeftijdgeslacht.Visible = true;
        }

        private void btn_leeftijdvolgende_Click(object sender, EventArgs e)
        {
            gb_leeftijdgeslacht.Visible = false;
            gb_gewicht.Visible = true;
        }


        // einde registratie
        // opslaan van gegevens in database
        private void btn_emailvolgende_Click(object sender, EventArgs e)
        {
            // gebruiker = new Gebruikerklasse();
           // gebruiker.Naam = Convert.ToString(tb_voornaam.Text);
           //// gebruiker.Achternaam = Convert.ToString(tb_achternaam.Text);
          //  gebruiker.Leeftijd = Convert.ToInt32(nud_leeftijd.Value);
          ///  gebruiker.Geslacht = Convert.ToString(cb_geslacht.Text);
          //  gebruiker.Huidig_gewicht = Convert.ToInt32(nud_huidiggewicht.Value);
          //  gebruiker.Streef_gewicht = Convert.ToInt32(nud_streefgewicht.Value);
          ///  gebruiker.Gebruikersnaam = Convert.ToString(tb_gebruikersnaam2.Text);
          //  gebruiker.Email = Convert.ToString(tb_email.Text);
         //   gebruiker.Wachtwoord = Convert.ToString(tb_wachtwoordsignup.Text);

            db.AddGebruiker();
            gb_email.Visible = false;
            // hier moet nog een GB!!!!!

        }

        private void btn_gewichtvolgende_Click(object sender, EventArgs e)
        {
            gb_gewicht.Visible = false;
            gb_email.Visible = true;
        }
    }
}    

6
这里有很多你需要改进的地方。首先,你的连接字符串应该放在配置文件中而不是硬编码在代码中。你应该使用 USING 语句来包装你的连接,而不是有单独的方法来打开和关闭连接。你的架构非常脆弱,由于处理连接不当很容易导致连接池被堵塞。 - Sean Lange
1
如果你正在使用MS SQL Server,为什么要捕获MySqlException异常呢? - mason
3
为什么这被标记为SQL Server,但你却捕获了MySQL的异常?如果实际上是SQL Server,那么这些异常将永远不会发生。请看OpenConnection中的catch块。如果您实际上捕获了异常,并且该异常代码不是0或1045,则您的catch块除返回false以外将无法做任何事情,这将使您无法进行调试。 - Sean Lange
1
INSERT语句在值之前没有列出列名。 - user47589
4
虽然不必列出列名,但您应该始终将其列出。这样可以避免由于表结构更改而导致查询无法工作,并有助于防止将数据插入错误的列中。不管是学校任务还是其他情况,养成这个好习惯很重要。 - Siyual
显示剩余5条评论
3个回答

9

向 SQL Server 数据库中插入数据的最简单方法:

string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database2.mdf;Integrated Security=True";

string commandText = "INSERT INTO MyTable (ID, Name, Address) VALUES (10, 'Bob', '123 Main Street');";

using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
}

只要commandText是有效的查询,它应该会插入一行数据。最好使用参数来表示你的值,而不是像我这里硬编码 - 这样可以避免SQL注入攻击和其他潜在问题。你可以在Google上搜索相关信息(或者你现在正在询问的问题),然后找到大量的资源帮助你。
如果你需要更具体的帮助,请提供详细信息,例如当你尝试运行代码时实际发生了什么 - 是否有异常?

我现在有这个: http://prnt.sc/drz4b5 http://prnt.sc/drz4ok仍然没有将任何内容上传到我的数据库。 - Cihan Kurt
尝试在“cmd.ExecuteNonQuery();”这一行上设置一个断点,以确保它正在运行。如果不是,请确保AddGebruiker()正在被调用 - 看起来你的按钮单击应该使其运行,但只有在正确处理“Click”事件时才能实现。 - Dave Smash
如果我按下“发送”按钮,它应该更新数据库。但实际上并没有发生。它似乎有点迟钝,但这意味着连接已经打开和关闭。如果我刷新数据库,什么也没添加。 - Cihan Kurt
设置断点以确保您的按钮正在执行您认为它应该执行的操作。如果插入操作不起作用,它应该会抛出异常并使您的程序崩溃。如果它正在运行,请检查您的连接字符串 - 它看起来与我通常使用的任何连接字符串都不同。您可以在Visual Studio中使用服务器资源管理器来查找您的连接字符串 - 单击要使用的数据库,它应该会出现在属性窗口中。 - Dave Smash
它使用断点完全执行相同的操作。我将尝试更改连接字符串并回到您那里。 - Cihan Kurt

1

在做其他任何事情之前,我会先清理一堆东西。

首先,完全摒弃openconnection和closeconnection方法。不要在类中保留连接的实例属性。使用using语句按需创建连接,因为在using语句结束时,编译器将插入对连接的IDisposable接口实现的Dispose方法的调用,并自动关闭连接。

因此,在清理所有不必要的代码后,你真正需要在这个类中实现的只有Addgebrukier方法,它应该长这样:

public void AddGebruiker()
{
        string query = "insert into Gebruiker VALUES(3, 'Cihan', 'Kurt', 18, 'Man', 85, 75, 'Admin1', 'Test123', 'testen');";
        using (SqlConnection connection = new SqlConnection(connectionstring))
        {
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                connection.Open();
                int resultaat = command.ExecuteNonQuery();
                if (resultaat == 1)
                {
                    MessageBox.Show("succes");
                }
                else
                {
                    MessageBox.Show("fail");
                }
            }
        }
    }

您还应该从应用程序/ web.config文件中的节中加载连接字符串,但是在使其正常运行后再执行此操作。


我还没有尝试过,但如果我运行你的代码,它会给我一个错误。我需要一个打开的连接来执行ExecuteNonQuery,否则它不会工作。 - Cihan Kurt
连接变量和 connection.Open(); 代码缺失。 - H.G. Sandhagen
你说得对,我忘记打开连接了。我现在正在编辑它。 - jeff.eynon

0

这里有一个简单的概念,应该非常适合你。只需更改ServerName、DatabaseName等即可。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string connetionString = null;
            SqlConnection connection ;
            SqlDataAdapter adapter = new SqlDataAdapter();
            string sql = null;
            connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password";
            connection = new SqlConnection(connetionString);
            sql = "insert into product (Product_id,Product_name,Product_price) values(6,'Product6',600)";
            try
            {
                connection.Open();
                adapter.InsertCommand = new SqlCommand(sql, connection);
                adapter.InsertCommand.ExecuteNonQuery();
                MessageBox.Show ("Row inserted !! ");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

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