C#WinForm下Form1连SQL登录后,如何让Form2、Form3等多窗体对数据库进行增删改查操作

i逐浪 2018-10-07 11:18:13
C#WinForm下Form1连SQL登录后,如何让Form2、Form3等多窗体对数据库进行增删改查操作?

本人初学C#,
因技术有限,现在能做到的是一个窗体连接一次本窗体设置的SQL连接,
即Form1下的SQL查询使用Form1下的SQL登录配置,Form2下的SQL查询使用Form2下的SQL登录配置,Form3下的SQL查询使用Form3下的SQL登录配置。

现认为此方法设计与修改太累,也占窗体空间,想实现Form1登录窗口输入服务器数据库用户密码,或直接本地登录,再连接一次数据库,后面所有窗体都能调用这个数据库的打开方式,直接进行增删改查操作
窗体Form1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

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

public static string strCon = "";
public static string sqlServer = "";//用于Form3的数据库表名传递

private DataTable getTable(string str)//获取数据库清单
{
try
{
SqlConnection sqlcon = new SqlConnection(str);
SqlDataAdapter da = new SqlDataAdapter("select name from sysdatabases ", sqlcon);
DataTable dt = new DataTable("sysdatabases");
da.Fill(dt);
return dt;
}
catch
{
return null;
}
}

private void Form1_Load(object sender, EventArgs e)
{
radioButton1.Checked = true;
}

private void button1_Click(object sender, EventArgs e) //打开选择服务器对话框
{
Form2 frm2 = new Form2();
frm2.ShowDialog();
comboBox2.Text = Form2.strServer;//获取Form2中选中的服务器名称
}

private void radioButton1_CheckedChanged(object sender, EventArgs e)//点击单选项“Windows身份登录”
{
textBox2.Enabled = textBox3.Enabled = false;
string str = "server=" + comboBox2.Text + ";database=master;Integrated Security=SSPI;";
comboBox1.DataSource = getTable(str);
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "name";
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)//点击单选项“SQL Server身份验证”
{
textBox2.Enabled = textBox3.Enabled = true;
textBox2.Focus();
}

private void button3_Click(object sender, EventArgs e)//点击按钮“登录”
{
if (radioButton1.Checked == true)//方案“Windows身份登录”
{
strCon = "Data Source=" + comboBox2.Text + ";Initial Catalog =" + comboBox1.Text + ";Integrated Security=SSPI;";
}
else if (radioButton2.Checked == true)//方案“SQL Server身份验证”
{
strCon = "Data Source=" + comboBox2.Text + ";Database=" + comboBox1.Text + ";Uid=" + textBox2.Text + ";Pwd=" + textBox3.Text + ";";
}
SqlConnection sqlcon = new SqlConnection(strCon);//更新参数strCon
try
{
sqlcon.Open();//数据库可以连接
sqlServer = comboBox1.Text;//给sqlServer赋值,使之等于comboBox1.Text

this.Hide();//当前窗体隐藏
Form3 frm3 = new Form3();
frm3.Show();//显示窗体Form3
}
catch
{
MessageBox.Show("用户或密码错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void button4_Click(object sender, EventArgs e)//点击按钮“取消”
{
Application.Exit();//全部退出结束窗体
}
}
}


窗体Form3
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FormTabNew
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}

private void Form3_Load(object sender, EventArgs e)
{
textBox1.Text = Form1.sqlServer;//获取Form中的数据库名
}

private void Form3_FormClosing(object sender, FormClosingEventArgs e)//触发窗体关闭事件
{

}

}

//如何实现对当前获取的数据库名称进行增删改查操作?
}


是通过函数来实现的,还是哪种方式实现?能否提供一下相应的思路与脚本供我参考一下?谢谢!!!
...全文
978 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_24498703 2018-10-09
  • 打赏
  • 举报
回复
感谢!
Eonothem。 2018-10-09
  • 打赏
  • 举报
回复
public class Form1: Form
{
public static SqlConnection Connection;
protected void Button1_Click(object sender, EventArgs args)
{
Connection = new SqlConnection(textbox1.Text);
}
}
游北亮 2018-10-09
  • 打赏
  • 举报
回复
楼主的目的,应该是只开一个连接,然后在其它窗体内一直复用这个连接,这个理论上是没有问题的,在Form1创建一个静态变量: public class Form1: Form { public static SqlConnection Connection; protected void Button1_Click(object sender, EventArgs args) { Connection = new SqlConnection(textbox1.Text); } } 这样在其它窗体就可以直接这么用:Form1.Connection.CreateCommand(); 但是这样存在几个问题: 1、多线程同时调用Connection时可能存在冲突; 2、挂着数据库长连接,用户多了,连接可能不够用
yaowf 2018-10-09
  • 打赏
  • 举报
回复
看楼主的code,Form2 & Form3是由Form1进行呼叫,若想要只开一次资料库的连线,最简单的做法就是把connection当成Form2 & Form3的建构式参数传入,这样在Form2 & Form3内就可任意使用Form1内的connection了!
enaking 2018-10-08
  • 打赏
  • 举报
回复
看来你是新手,你需要去补一下面向对象编辑,你要写一个sql的类,将连接字符串或连接对象设为静态。
雨何方 2018-10-08
  • 打赏
  • 举报
回复
代码框架如下: “................”部份这个完善代码。或是去问度娘。 namespace winForm { public class DataClass//创建一个类。 { //数据库连接字符串 public SqlConnection Sql_Open(){..................}//连接数据库 public int Sql_Close(){..................}//关闭数据库 public DataSet Sql_DataSet(string Sqlstr,string TableName){ ...............}//创建DataSet。 public void RunSqlCommand(string SqlCommand){ ..........}//创建执行SQL命令的方法。 //。。。。。 } } using System.Data; using System.Data.SqlClient; namespace winForm { public partial class Form1//窗体。 { public from1 { InitializeComponent(); } DataClass dataClass=new DataClass();//实例化:DataClass DataSet ds=new DataSet(); //实例化类:DataSet. public void button1_Click(object sender,EventHendler e) { //查询 ds=dataClass.Sql_DataSet(.................) ............... //执行SqlCommand dataClass.RunSqlCommand(..........) ................ } } } 备注: 1.在每个窗体中,【DataClass dataClass=new DataClass();//实例化:DataClass】 后,都可以使用该类中的所有公共方法。 2.当然,随着你的认知深入,还可以考滤加入接口(interface),在类加添加函数等元素,让其更完善,更便利。 3.以上代码手工输入,如果有拼写误之处,还请见谅。
张天星 2018-10-08
  • 打赏
  • 举报
回复
Sql连接字符串以及CRUD的组串,单独写一个类,你可以搜索DAL层。
然后Form1,Form2,Form3等,都实例一个DAL对象出来,进行数据库操作。
E次奥 2018-10-08
  • 打赏
  • 举报
回复
网上一堆sqlhelper类,你随便搜一下,就能找到一堆,各种写法的! 然后用最简单的一种,把所有方法都熟悉了,数据库调用问题自然就懂了;
i逐浪 2018-10-08
  • 打赏
  • 举报
回复
引用 2 楼 MORANS 的回复:
创建一个Class,实现数据库的连接connection,打开Open,关闭Close,读取DataSet,执行Run等。

然后在窗体中引用这个类即可。
Class class=new Class();

class........................
能否提供一些脚本参考一下?我只是想连接一次数据库,后面的查询再根据前面选择的数据库对象来进行
i逐浪 2018-10-08
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
sqlhelper.cs 类了解一下
我是初学,这个有点泛,能明确一下具体怎么使用的吗?我只是想连接一次数据库,后面的查询再根据前面选择的数据库对象来进行
i逐浪 2018-10-08
  • 打赏
  • 举报
回复
引用 5 楼 weixin_42440574 的回复:
别忘了在config配置文件中增加数据库连接配置
<connectionStrings>
<!--数据库连接字符串-->
<add name="DBConn_GosDB_Test" connectionString="Data Source=123.57.68.190,14333;Initial Catalog=DataBaseName;uid=sa;pwd=123456" providerName="System.Data.SqlClient"/>
</connectionStrings>
我的服务器、数据库等信息都是变化的,今天是连接A服务器,明天可能是连接B服务器,这个写死的办法不实用
  • 打赏
  • 举报
回复
你这个是要自己在第一个界面配置数据库连接?那么你的form1需要公开一个static的字符串,这样form2和form3就可以直接Form1.XXX来获取字符串,其它数据库连接什么的你直接ado.net或者sqlhelper之类的就行了
飘渺一方 2018-10-08
  • 打赏
  • 举报
回复
别忘了在config配置文件中增加数据库连接配置 <connectionStrings> <!--数据库连接字符串--> <add name="DBConn_GosDB_Test" connectionString="Data Source=123.57.68.190,14333;Initial Catalog=DataBaseName;uid=sa;pwd=123456" providerName="System.Data.SqlClient"/> </connectionStrings>
飘渺一方 2018-10-08
  • 打赏
  • 举报
回复
string sql = "select * from [datatable]"; System.Data.DataTable dt = GemCommon.DbConnCls.ExecuteQueryToDataTable(sql, conn);
飘渺一方 2018-10-08
  • 打赏
  • 举报
回复
使用单独的数据库连接类 代码参考我的博文: https://blog.csdn.net/weixin_42440574/article/details/82963227
雨何方 2018-10-08
  • 打赏
  • 举报
回复
创建一个Class,实现数据库的连接connection,打开Open,关闭Close,读取DataSet,执行Run等。 然后在窗体中引用这个类即可。 Class class=new Class(); class........................
可来先生 2018-10-08
  • 打赏
  • 举报
回复
就是数据库的问题吧,写个链接数据库的类可以解决
threenewbee 2018-10-08
  • 打赏
  • 举报
回复
sqlhelper.cs 类了解一下
csdnFUCKINGSUCKS 2018-10-08
  • 打赏
  • 举报
回复

public partial class BaseForm : Form
{
    public static string Con { get; set; }
    public BaseForm()
    {
    }
}
创建一个窗体基类,公开一个静态属性,其他窗体继承这个基类。
  • 打赏
  • 举报
回复
SqlConnection sqlcon = new SqlConnection(strCon);//更新参数strCon
try
{
sqlcon.Open();//数据库可以连接
sqlServer = comboBox1.Text;//给sqlServer赋值,使之等于comboBox1.Text

// this.Hide();//当前窗体隐藏
//Form3 frm3 = new Form3();
//frm3.Show();//显示窗体Form3
}
catch
{
MessageBox.Show("用户或密码错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}


这一块拿出来做一个方法。而你strCon 不固定的话,可以采用各个=窗体静态变量 Public Static string strConNew = ""; 这种方式来传值
加载更多回复(1)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧