gpt4 book ai didi

c# - 跨类 c# 使用多个对象

转载 作者:太空宇宙 更新时间:2023-11-03 18:28:44 24 4
gpt4 key购买 nike

我有三个类,它们保存来自输入表单的数据,然后每个类都向数据库提交一个插入查询。

必须有更好的方法来使用现有对象和单个存储过程来执行此操作,但我无法让现有对象在另一个类中工作。对于问题的简单性,我深表歉意,因为我认为这是整理代码的非常直接的修复方法。

使用下面的代码,我试图实现的是在 StoredProc 类中重用 EndUser、Bank 和 Company 的现有实例,这样我就不必在每个类方法中使用 SQL 查询,而只需使用一个保存方法StoredProc 类。

编辑为了澄清数据库的东西,即 SQL 字符串不是问题,我想问的是我可以在 storedproc 类中使用现有对象(其中三个)的实例,以便我可以使用一个(已经编写的)存储过程吗?

抱歉,代码有点长,但我已尽可能地精简它,同时仍然有意义(以及运行):

表单后端

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

private void button1_Click(object sender, EventArgs e)
{
EndUser newUser = new EndUser(textBox1.Text, textBox2.Text);
Company newcmpny = new Company(textBox4.Text, textBox3.Text);
Bank newbank = new Bank(textBox6.Text, textBox5.Text);
newUser.Save();
newcmpny.Save();
newbank.Save();
}
}

DataHold 类(全部在一个文件中)

    class EndUser
{
public EndUser(string first, string last) {
firstName = first;
lastName = last;
}
public int iD { get; set; }
public string firstName { get; set; }
public string lastName { get; set; }

public void Save()
{
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
{
string sqlQuery = (@"INSERT INTO [EndUser] (FirstName, LastName)
VALUES (@FirstName, @LastName)");
connection.Open();

using (SqlCommand command = new SqlCommand(sqlQuery, connection))
{
command.Parameters.AddWithValue("FirstName", firstName).ToString();
command.Parameters.AddWithValue("LastName", lastName).ToString();
command.ExecuteNonQuery();
}
}
}
}

class Company
{
public Company(string cmpny, string tele)
{
company = cmpny;
telephone = tele;
}

public string company { get; set; } // textbox4
public string telephone { get; set; } // textbox3

public void Save()
{
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
{
string sqlQuery = (@"INSERT INTO [Company] (CName, Telephone)
VALUES (@CName, @Telephone)");
connection.Open();

using (SqlCommand command = new SqlCommand(sqlQuery, connection))
{
command.Parameters.AddWithValue("CName", company).ToString();
command.Parameters.AddWithValue("Telephone", telephone).ToString();
command.ExecuteNonQuery();
}
}
}
}

class Bank
{
public Bank(string bn, string scode)
{
name = bn;
sortcode = scode;
}
public string name { get; set; } // textbox6
public string sortcode { get; set; } // textbox5
public void Save()
{
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
{
string sqlQuery = (@"INSERT INTO [Bank] (BankName, SortCode)
VALUES (@BankName, @SortCode)");
connection.Open();

using (SqlCommand command = new SqlCommand(sqlQuery, connection))
{
command.Parameters.AddWithValue("BankName", name).ToString();
command.Parameters.AddWithValue("SortCode", sortcode).ToString();
command.ExecuteNonQuery();
}
}
}
}

class StoredProc
{
public void ToTheDB()
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
{
con.Open();
using(SqlCommand cmd = new SqlCommand("Procedure",con))
{
cmd.CommandType = CommandType.StoredProcedure;
// cmd.Parameters.AddWithValue("FirstName", newUser.firstName);
cmd.ExecuteNonQuery();
}
}
}
}

最佳答案

首先 - IMO 这是一个写得很糟糕的代码。

我的建议:

  • 不要混合使用模型和 SQL 查询或任何数据库逻辑。
  • 不要在 C# 代码中使用纯 SQL,而是使用 Entity Framework 或存储过程。
  • 不要保存共享相同业务逻辑的多个实体而不用单个事务包装它们。

你问过:“我可以在 storedproc 类中使用现有对象的实例(其中三个)以便我可以使用一个(已经编写的)存储过程吗”

答案是——您几乎不能以那种方式使用现有代码。据我所知,您没有存储过程。您只有带有 SQL 查询的字符串。

无论如何,您可以尝试将您的类用作存储过程类中的模型,并创建使用它们的新存储过程。

它应该看起来像这样:

class StoredProc
{
public void ToTheDB(EndUser endUser, Company company, Bank bank)
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
{
con.Open();
using(SqlCommand cmd = new SqlCommand("Procedure",con))
{
cmd.CommandType = CommandType.StoredProcedure;
//Here you can use data from your "model" classes and add them as parameters for your stored procedure.
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = endUser.firstName;
//the rest of the parameters from EndUser, Company and Bank classes

cmd.ExecuteNonQuery();
}
}
}
}

再次重申,您应该将逻辑和模型分开。

这是一个示例模型:

public class Bank
{
public string name { get; set; }
public string sortCode { get; set; }
}

Ant this 是数据访问层或存储库的方法:

void AddBank(Bank bank)
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString))
{
con.Open();
//Procedure for inserting
using(SqlCommand cmd = new SqlCommand("Procedure",con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = bank.name;
cmd.ExecuteNonQuery();
}
}
}

关于c# - 跨类 c# 使用多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27620049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com