如何将对象类放入SQL查询c#?
我想将对象“gebruiker”的值从类“Gebruikersklasse”放到按钮单击中的查询中。查询将被发送到“Databaseconnection”类并在那里执行。如果我运行这个,我会出错。它告诉我找不到gebruikers.Naam。所以他找不到一个叫做“gebruiker”的东西 如果我将查询更改为手动值,它就会工作 我正在使用这些类:如何将对象类放入SQL查询c#?,c#,sql-server,class,C#,Sql Server,Class,我想将对象“gebruiker”的值从类“Gebruikersklasse”放到按钮单击中的查询中。查询将被发送到“Databaseconnection”类并在那里执行。如果我运行这个,我会出错。它告诉我找不到gebruikers.Naam。所以他找不到一个叫做“gebruiker”的东西 如果我将查询更改为手动值,它就会工作 我正在使用这些类: using System; using System.Collections.Generic; using System.Linq; using Sy
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;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// voor sql connectie.
using System.Data.SqlClient;
using System.Windows.Forms;
这是数据库连接的代码(执行查询)
这是按钮单击代码:
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(1, gebruiker.Naam, gebruiker.Achternaam, gebruiker.Leeftijd, gebruiker.Geslacht, gebruiker.Huidiggewicht, gebruiker.Streefgewicht, gebruiker.Gebruikersnaam, gebruiker.Email, gebruiker.Wachtwoord);", gebruiker);
gb_email.Visible = false;
}
编辑:
我得到的确切错误是:
BurnThatFat.exe中发生类型为“System.Data.SqlClient.SqlException”的未处理异常
其他信息:无法绑定多部分标识符“gebruiker.Naam”
无法绑定多部分标识符“gebruiker.Achternaam”
无法绑定多部分标识符“gebruiker.Leeftijd”
无法绑定多部分标识符“gebruiker.Geslacht”
无法绑定多部分标识符“gebruiker.Huidiggewicht”
无法绑定多部分标识符“gebruiker.Streefgewicht”
无法绑定多部分标识符“gebruiker.Gebruikersnaam”
无法绑定多部分标识符“gebruiker.Email”
无法绑定多部分标识符“gebruiker.Wachtwoord”
您需要将gebruiker
值传递给SQL命令。现在你没那么做。您的QueryToDatabase
应该通过传递参数进行扩展
public void QueryToDatabase(string commandText, Gebruikerklasse gebruiker)
{
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);
// do the same with others properties in gebruiker
cmd.ExecuteNonQuery();
conn.Close();
}
}
你的问题也错了。您需要告诉SQL它应该在哪里查找参数
"INSERT INTO Gebruiker ([Gebruiker-ID], Naam, Achternaam, Leeftijd, Geslacht, Huidig_gewicht, Streef_gewicht, Gebruikersnaam, Email, Wachtwoord) VALUES(1, @Naam, @Achternaam, @Leeftijd, @Geslacht, @Huidiggewicht, @Streefgewicht, @Gebruikersnaam, @Email, @Wachtwoord);
SQL查询中的名称与AddWithValue
中使用的名称应匹配
如果您不想手动执行此操作,请查看ORMs。由于SQL找不到任何具有该名称的表或引用,因此会出现此错误,您可以通过存储过程实现类似的功能
首先在sql中创建过程:
CREATE PROCEDURE insertGebruiker(
@Naam VARCHAR(50),
@Achternaam VARCHAR(50),
@Leeftijd INT,
@Geslacht VARCHAR(50),
@Huidiggewicht INT,
@Streefgewicht INT,
@Gebruikersnaam VARCHAR(50),
@Email VARCHAR(50),
@Wachtwoord VARCHAR(50),
)
AS
BEGIN
INSERT INTO Gebruiker(
[Gebruiker-ID],
Naam,
Achternaam,
Leeftijd,
Geslacht,
Huidig_gewicht,
Streef_gewicht,
Gebruikersnaam,
Email,
Wachtwoord)
VALUES (
1,
@Naam,
@Achternaam,
@Leeftijd ,
@Geslacht,
@Huidiggewicht ,
@Streefgewicht ,
@Gebruikersnaam ,
@Email,
@Wachtwoord,
)
END
现在从您的c#代码:
您只需使用过程的名称来调用它:
db.QueryToDatabase("insertGebruiker", gebruiker);
整个和准确的错误是什么?虽然这两个答案是正确的,因为您将对象传递到querytodatabase
,但您甚至从未使用过它,但我认为您的问题在到达之前就出现了。@crowcoder我将确切的错误添加到了原始的post.ok中,因此这是一个SQL错误。按照其中一个答案所示去做,因为你不能将gebruiker.Naam
放入字符串中,因为它不会以这种方式扩展变量的实际值。你能看看我的问题@2ndanswer吗?而AddWithValue
不是设置参数值的首选方法,您不需要使用
块显式关闭中的连接,@Pawełukasik的答案看起来不错。如果我发送一个没有参数@naam的查询,会发生什么?它会崩溃还是忽略它并继续使用@achternaam?我尝试了这个方法并得到以下错误:{“不正确的语法靠近”;“}该错误已解决,现在该错误:{“字符串或二进制数据将被截断。\r\n语句已终止。”}@Gigitex这意味着你的一列对于输入的数据来说太短了,所以我应该把它改为Varcar(MAX)?
public void QueryToDatabase(string procedureName, Gebruikerklasse gebruiker)
{
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(procedureName, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
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);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
db.QueryToDatabase("insertGebruiker", gebruiker);