SQL C#并非所有参数都使用

时间:2017-01-06 17:50:01

标签: c# sql sql-server parameters

有人建议我为我的注册表单使用参数。

链接到它:How to get an object class into SQL Query c#?

我想使用相同的类登录,但是我收到以下错误:

我的数据库类使用所有参数进行注册。但是如果我想使用同一个类登录,我只需要其中的两个。被称为:Gebruikersnaam(用户名)和Wachtwoord(密码)。

  

System.Data.dll中出现未处理的“System.Data.SqlClient.SqlException”类型异常

     

附加信息:参数化查询'(@Naam nvarchar(4000),@ Achternaam nvarchar(1),@ Leeftijd int,@ Ges'需要参数'@Naam',这是未提供的。

这是我的班级:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

namespace BurnThatFat
{
    class databaseconnection
    {
        string connectionString = @"Data Source=(LocalDB)\V11.0;AttachDbFilename=C:\Users\Cihan\Documents\BurnThatFat\BurnThatFat\Database2.mdf;Integrated Security=True";
        bool succes = true;

        public bool Succes
        {
            get { return succes; }
            set { succes = value; }
        }

        public void QueryToDatabase(string commandText, Gebruikerklasse gebruiker)
        {
            // nieuwe connectie maken
            // ontvangt de query vanuit 'buttonclick' en voert hem hier uit
            // als ExecuteNonQuery niet kan worden uitgevoerd is er iets fout gegaan. D.m.v een bool moet hij dan een bericht tonen
            using (SqlConnection conn = new SqlConnection(connectionString))
            using (SqlCommand cmd = new SqlCommand(commandText, conn))
            {
                conn.Open();

                cmd.Parameters.AddWithValue("@Naam", gebruiker.Naam);
                cmd.Parameters.AddWithValue("@Achternaam", gebruiker.Achternaam);
                cmd.Parameters.AddWithValue("@Leeftijd", gebruiker.Leeftijd);
                cmd.Parameters.AddWithValue("@Geslacht", gebruiker.Geslacht);
                cmd.Parameters.AddWithValue("@Huidiggewicht", gebruiker.Huidiggewicht);
                cmd.Parameters.AddWithValue("@Streefgewicht", gebruiker.Streefgewicht);
                cmd.Parameters.AddWithValue("@Gebruikersnaam", gebruiker.Gebruikersnaam);
                cmd.Parameters.AddWithValue("@Email", gebruiker.Email);
                cmd.Parameters.AddWithValue("@Wachtwoord", gebruiker.Wachtwoord);

                int a = cmd.ExecuteNonQuery();

                if (a > 0)
                {
                    Succes = true;
                }
                else 
                {
                    Succes = false;
                }

                conn.Close();
            }
        }
    }
}

这是Gebruiker类:​​

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BurnThatFat
{
    class Gebruikerklasse
    {
        public string Naam;
        public string Achternaam;
        public int Leeftijd;
        public string Geslacht;
        public int Huidiggewicht;
        public int Streefgewicht;
        public string Gebruikersnaam;
        public string Email;
        public string Wachtwoord;

    }
}

这是用于注册的按钮点击代码(可行)

 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.Huidiggewicht = Convert.ToInt32(nud_huidiggewicht.Value);
            gebruiker.Streefgewicht = 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.QueryToDatabase("INSERT INTO Gebruiker([Gebruiker-ID], Naam, Achternaam, Leeftijd, Geslacht, Huidig_gewicht, Streef_gewicht, Gebruikersnaam, Email, Wachtwoord) VALUES(13, @Naam, @Achternaam, @Leeftijd, @Geslacht, @Huidiggewicht, @Streefgewicht, @Gebruikersnaam, @Email, @Wachtwoord);", gebruiker);

            // Als dit is gedaan, kijken of het is gelukt of niet. Als het geen succes is, geef foutmelding weer. Als het wel een succes is, spring naar Log in scherm
            Thread.Sleep(500);

            if (db.Succes == false)
            {
                MessageBox.Show("Er is iets fout gegaan, sluit de applicatie af en probeer het overnieuw");
            }
            else
            {
                MessageBox.Show("Account met succes aangemaakt, log nu in");
                gb_email.Visible = false;

                gb_login.Visible = true;
            }
        }
}

这是用于登录的buttonclick代码(不起作用,给我上面显示的错误)

private void btn_loginvolgende_Click(object sender, EventArgs e)
        {
            gebruiker = new Gebruikerklasse();
            gebruiker.Gebruikersnaam = Convert.ToString(tb_gebruikersnaamlogin.Text);
            gebruiker.Wachtwoord = Convert.ToString(tb_wachtwoordlogin.Text);
            gebruiker.Achternaam = "a";
            gebruiker.Email = "a";
            gebruiker.Geslacht = "a";
            gebruiker.Huidiggewicht = 1;
            gebruiker.Streefgewicht = 1;
            gebruiker.Leeftijd = 1;

            db.QueryToDatabase("Select count (*) from Gebruiker where Wachtwoord = @Wachtwoord AND Gebruikersnaam = @Gebruikersnaam;", gebruiker);
            Thread.Sleep(500);

            if (db.Succes == false)
            {
                MessageBox.Show("Login gegevens kloppen niet!");
            }
            else
            {
                MessageBox.Show("U bent met succes ingelogd");
            }

            // hier moet nog een GB!!!!!!
        }

3 个答案:

答案 0 :(得分:2)

在此代码中,您将参数@Naam添加到这两个命令中。在有效的查询中,为gebruiker.Naam分配值并将该值赋给参数。在不起作用的那个中,gebruiker.Naam为null,并且您尝试为参数指定null。

这导致了棘手的部分(直到你习惯它) - SQL Server使用DBNull,而C#使用null,它们不是同一个东西(即使你可能期望它们是。)如果你想要一个SQL参数为“null”,那么你想说:

data.objectId

最简单的解决方案是在db类中添加单独的方法以进行登录和注册。这样,您只需创建实际需要的参数,并且不需要在gebruiker类中为空值添加一百万次检查。

答案 1 :(得分:0)

正在寻找你的参数Naam。您在登录时分配值时错过了它。

gebruiker.Naam = ???

答案 2 :(得分:0)

您应该包含所有参数值。在代码中,您错过了btn_loginvolgende_Click方法中的参数值。

private void btn_loginvolgende_Click(object sender, EventArgs e)
            {
    gebruiker.Naam = Convert.ToString("test");
    ..

    }