wtuqi
5/12/2020 - 7:51 AM

DataBase数据库

//insert字符及图片
OpenFileDialog OpenDialog = new OpenFileDialog();
//文件路径控件
if (OpenDialog.ShowDialog == Windows.Forms.DialogResult.OK) {
	byte[] da;

	da = My.Computer.FileSystem.ReadAllBytes(OpenDialog.FileName);
	Mycom = new OleDbCommand();
	Mycom.CommandText = "insert into User_name(Nam,bz,Jltm,img) values(@Nam,@bz,@Jltm,@img)";
	Mycom.Parameters.Add("@Nam", OleDbType.VarChar).Value = TextBox1.Text.Trim;
	Mycom.Parameters.Add("@bz", OleDbType.VarChar).Value = TextBox2.Text.TrimMycom.Parameters.Add("@Jltm", OleDbType.VarChar).Value == TextBox3.Text.Trim;
	Mycom.Parameters.Add("@img", OleDbType.Binary).Value = da;

	Mycom.Connection = Mycon;
	if (Mycom.ExecuteNonQuery > 0) {
		MsgBox("数据+图片添加成功");
	}
	Mycom.Dispose();
}
'Datatable绑定更新
Dim MdataAdapter As New OleDbDataAdapter()
Dim CB As OleDbCommandBuilder
Dim Mytable As DataTable

MdataAdapter = New OleDbDataAdapter("Select * from Pr", Mcon)
CB = New OleDbCommandBuilder(MdataAdapter)
MdataAdapter.Fill(Mytable)
DataGridView1.DataSource = Mytable

Private Sub SaveData()
  Try
      Dim MsgInt As Integer = MsgBox("请确认是否更新数据?", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "更新提示")
      If MsgInt = 1 Then
          Dim tempDT As DataTable
          tempDT =Mytable
          If tempDT Is Nothing Then
              MsgBox("数据未修改")
              Exit Sub
          End If
          MdataAdapter.UpdateCommand = CB.GetUpdateCommand
          MdataAdapter.InsertCommand = CB.GetInsertCommand
          MdataAdapter.DeleteCommand = CB.GetDeleteCommand
          'End If
          MdataAdapter.Update(SqlTab)
          MsgBox("数据已更新", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel, "提示")
      Else
          Exit Sub
      End If
  Catch ex As Exception
      MsgBox(ex.Message.ToString)
  End Try
End Sub

'单行数据更新 
'出错列 子查询返回的值不止一个。当子查询跟随在 =、!=、
'当对一个执行一次性更新多条记录的操作时,如果此表上还有更新触发器则可能引发此错误。
Dim da As SqlDataAdapter
Dim dt As New DataTable
Dim dr As DataRow
Dim sqlcmd As String

sqlcmd = "select * from patient where p_no='" & Trim(TextBox1.Text) & "'"
da = New SqlDataAdapter(sqlcmd, ModuleCommon.conn)
da.Fill(dt)
'添加  dr = dt.NewRow()'
dr = dt.Rows(0)
dr.BeginEdit()
'添加   da.InsertCommand = New SqlCommandBuilder(da).GetInsertCommand()
da.UpdateCommand = New SqlCommandBuilder(da).GetUpdateCommand()
dr("p_no") = TextBox1.Text
dr("p_name") = TextBox2.Text
dr("p_sex") = ComboBox1.Text
dr("p_address") = TextBox4.Text
' 添加  dt.Rows.Add(dr)
dr.EndEdit()
da.Update(dt.GetChanges())
Call 病人管理.WinLoad()'刷新界面'
//方法一:系统时间的格式化,如果直接是NOW可以不格式化录入
Mydate = DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss");
//方法二:日期控件值格式化录入.ToString("yyyy-MM-dd HH:mm") 推荐
Mycom.CommandText = string.Format("insert into Pr(tzdh,ypbh,wtdate) values('{0}','{1}','{2}'", TextBox1.Text, TextBox2.Text, this.DateTimePicker1.Value.ToString("yyyy-MM-dd HH:mm"));
//方法三:先格式化控件显示的文件,然后用日期控件文件插入ACCESS,至于##还是''包夹参数都是允许的
DateTimePicker1.Format = DateTimePickerFormat.Custom;
//设置自定义模式
DateTimePicker1.CustomFormat = "yyyy-MM-dd HH:mm";
Mycom.CommandText = string.Format("insert into Pr(tzdh,ypbh,wtdate) values('{0}','{1}',#{2}#,", TextBox1.Text, TextBox2.Text, this.DateTimePicker1.Text);
//DataTable备份还原数据(XML方式)
//OutXML(Me.DataGridView1, Me.DataDataSet.Pr)
//选中项导出XML
private void OutXML(DataGridView MyGrid, DataTable MyDt)
{
	try {
		DataTable BakDt = new DataTable();
		//无法序列化DataTable。数据表名称未设置用下面注释方法
		//dt = new DataTable { TableName = "TableNames"}; 
		BakDt = MyDt.Clone;
		foreach (DataGridViewRow SelRow in MyGrid.SelectedRows) {
			//Debug.Print(SelRow.Cells(0).RowIndex)
			BakDt.Rows.Add(MyDt.Rows(SelRow.Cells(0).RowIndex).ItemArray);
		}
		if (this.FolderBrowserDialog1.ShowDialog == Windows.Forms.DialogResult.OK) {
			BakDt.WriteXml(this.FolderBrowserDialog1.SelectedPath.ToString + "\\RowBak" + Now.Date.ToString("yyyyMMdd") + ".Dat");
			MessageBox.Show("选中数据行,已成功备份!", "备份", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
		}
	} catch (Exception ex) {
		MsgBox(ex.Message.ToString, MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "错误");
	}

}

//InPXML(Me.DataDataSet.Pr)
//从XML读取到数据表
private void InPXML(DataTable MyDt)
{


	try {
		static_InPXML_Rowindex = this.DataDataSet.Pr.Compute("Max(ID编号)", "");
		DataTable BakDt = new DataTable();
		BakDt = MyDt.Clone;
		//克隆构架

		if (this.OpenFileDialog1.ShowDialog == Windows.Forms.DialogResult.OK) {
			//利用排序过程改写XML中的ID编号列值不与当前表重复
			SortXml(OpenFileDialog1.FileName.ToString, "ID编号", static_InPXML_Rowindex);
			BakDt.ReadXml(OpenFileDialog1.FileName.ToString);
			MyDt.Merge(BakDt);
			//合并
		}

	} catch (Exception ex) {
		MessageBox.Show(ex.ToString, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
	}
}

//排序过程
//XML遍历ID并改写
private void SortXml(string Path, string ID, int IDval = 0)
{
	XDocument doc = XDocument.Load(Path);
	int A = IDval;

	//'倒序()
	//For Each quer As XElement In (From people In doc.Descendants("ID编号"))
	//    A -= 1
	//    quer.Value = A
	//    Debug.Print(quer)
	//Next

	//顺序()
	foreach (XElement quer in doc.Descendants(ID)) {
		A += 1;
		quer.Value = A;
		Debug.Print(quer);
	}
	doc.Save(Path);
}
//存储过程参数式执行
public static void DbExePa(SqlConnection Con, string Param1, string Param2, string Param3, string Param4)
{
	try {
		if (Con.State == 1) {
			Con.Close();
		}
		Con.Open();
		SqlCommand Mycom = new SqlCommand();
		Mycom.Connection = Con;
		Mycom.CommandType = CommandType.StoredProcedure;
		Mycom.CommandText = "Proc_User";
		//过程名
		Mycom.Parameters.Add("@names", SqlDbType.VarChar, 80).Value = Param1;
		//传入参数1值
		if (!Param2 == null) {
			Mycom.Parameters.Add("@name", SqlDbType.VarChar, 80).Value = Param2;
		}
		if (!Param3 == null) {
			Mycom.Parameters.Add("@pwd", SqlDbType.VarChar, 80).Value = Param3;
		}
		if (!Param4 == null) {
			Mycom.Parameters.Add("@a", SqlDbType.VarChar, 80).Value = Param4;
		}
		//执行
		if (Mycom.ExecuteNonQuery > 0) {
			MsgBox("添加成功");
		}

	} catch (Exception ex) {
		MessageBox.Show(ex.ToString);
	}
	
//Parameters参数方式添加图片
OpenFileDialog MyOpenDialog = new OpenFileDialog();
//'文件路径控件
if (MyOpenDialog.ShowDialog == Windows.Forms.DialogResult.OK) {
	byte[] Mybyte;
	Mybyte = My.Computer.FileSystem.ReadAllBytes(MyOpenDialog.FileName);

	Mycom.CommandText = "insert into User_name(Nam,bz,Jltm,img) values(@Nam,@bz,@Jltm,@img)";
	Mycom.Parameters.Add("@Nam", OleDbType.VarChar).Value = TextBox1.Text.Trim;
	Mycom.Parameters.Add("@bz", OleDbType.VarChar).Value = TextBox2.Text.Trim;
	Mycom.Parameters.Add("@Jltm", OleDbType.VarChar).Value = TextBox3.Text.Trim;
	Mycom.Parameters.Add("@img", OleDbType.Binary).Value = Mybyte;

	Mycom.Connection = Mycon;
	if (Mycom.ExecuteNonQuery > 0) {
		MsgBox("数据+图片添加成功");
	}
	Mycom.Dispose();
}

//通过ExecuteReader来获取图片并将其显示到Picturebox控件
Mycom.CommandText = "select img from bytes where id =" + Convert.ToInt32(TextBox1.Text);
//注意选择编号
Mycom.Connection = Mycon;
OleDb.OleDbDataReader MySdr;
MySdr = Mycom.ExecuteReader;
if (MySdr.Read) {
	byte[] MyByte;
	MyByte = MySdr(0);
	PictureBox1.Image = Bitmap.FromStream(new IO.MemoryStream(Mybyte));
}
MySdr.Close();
Mycom.Dispose();
'txt读取到二维数组
Public Shared Function TxtToArr(ByVal path As String) As String(,)
    Dim file As New StreamReader(path)
    '读取文件获取行数
    Dim s As String = " "
    Dim Rows As Integer = 0
    While (s.Length > 0)
        s = file.ReadLine()
        If s = Nothing Then Exit While
        Rows += 1
    End While
    file.Close()

    '循环读取表格到二维数组
    file = New StreamReader(path, System.Text.Encoding.Default)
    Dim dt(Rows, 42) As String
    s = " "
    Rows = 0
    While (s.Length > 0)
        s = file.ReadLine()
        If s = Nothing Then Exit While
        For i As Integer = 0 To s.Split(",").Count - 2
            'If s.Split(",")(i) = Nothing Then Exit For
            If s.Split(",")(i) = Nothing Then
                dt(Rows, i) = ""
            Else
                dt(Rows, i) = s.Split(",")(i)
            End If
        Next
        Rows += 1
    End While

    file.Close()
    Return dt
End Function
    
‘使用
      Dim arr(,) As String = ReadTxToDt(Filename)
        ‘GetUpperBound(0)获取第一维上限
        For i As Integer = 1 To arr.GetUpperBound(0) - 1
            SqlHelper.Run(String.Format( _
          "insert into 测试参数(规格型号,额定电压,ACDC,线圈电流上限,F6开距下限,F6开距上限,F7开距下限,F7开距上限,F8开距下限,F8开距上限,F9开距下限,F9开距上限,L1开距下限,L1开距上限,L2开距下限,L2开距上限,L3开距下限,L3开距上限,L4开距下限,L4开距上限,开距同步差下限,开距同步差上限,F6超程下限,F6超程上限,F7超程下限,F7超程上限,F8超程下限,F8超程上限,F9超程下限,F9超程上限,L1超程下限,L1超程上限,L2超程下限,L2超程上限,L3超程下限,L3超程上限,L4超程下限,L4超程上限,额定频率,触头类型,吸合电压起始值,释放电压起始值) " _
           & "values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}','{19}','{20}','{21}','{22}','{23}','{24}','{25}','{26}','{27}','{28}','{29}','{30}','{31}','{32}','{33}','{34}','{35}','{36}','{37}','{38}','{39}','{40}','{41}')", arr(i, 1), arr(i, 2), arr(i, 3), arr(i, 4), arr(i, 5), arr(i, 6), arr(i, 7), arr(i, 8), arr(i, 9), arr(i, 10), arr(i, 11), arr(i, 12), arr(i, 13), arr(i, 14), arr(i, 15), arr(i, 16), arr(i, 17), arr(i, 18), arr(i, 19), arr(i, 20), arr(i, 21), arr(i, 22), arr(i, 23), arr(i, 24), arr(i, 25), arr(i, 26), arr(i, 27), arr(i, 28), arr(i, 29), arr(i, 30), arr(i, 31), arr(i, 32), arr(i, 33), arr(i, 34), arr(i, 35), arr(i, 36), arr(i, 37), arr(i, 38), arr(i, 39), arr(i, 40), arr(i, 41), arr(i, 42)))
        Next
'连接Excel[Imports System.Data.OleDb '必须的引用]
Dim MyCon As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ExcelName.xls;Extended Properties='Excel 8.0;IMEX=1';")
'打开OFFCE2007的方式  
'Dim myConn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=2.xlsx;Extended Properties='Excel 12.0;IMEX=1';") 
MyCon.Open()
Dim MyAdapter As New OleDbDataAdapter("SELECT * FROM [SheetName$]", MyCon)
Dim MyDs As New DataSet
MyAdapter.Fill(MyDs, "ExcelInfo")
$DataGridView$.DataSource = MyDs.Tables("ExcelInfo")
MyCon.Close()
'IMEX是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式。
'当我们设置IMEX=1时将强制混合数据转换为文本,但仅仅这种设置并不可靠,IMEX=1只确保在某列前8行数据
'至少有一个是文本项的时候才起作用,它只是把查找前8行数据中数据类型占优选择的行为作了略微的改变。例
'如某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。
'另一个改进的措施是IMEX=1与注册表值TypeGuessRows配合使用,TypeGuessRows 值决定了ISAM 驱动程序从前几
'条数据采样确定数据类型,默认为“8”。可以通过修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”
'下的该注册表值来更改采样行数。但是这种改进还是没有根本上解决问题,即使我们把IMEX设为“1”, TypeGuessRows设得再大,
'例如1000,假设数据表有1001行,某列前1000行全为纯数字,该列的第1001行又是一个文本,ISAM驱动的这种机制还是让这列的数据变成空

'连接到ACCESS数据库
Imports System.Data.OleDb
Mcon.Str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$AccessFileName$;Persist Security Info=False"
' 加密方式数据库打开语句("Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=true;Data Source=$AccessFileName$;;Jet OLEDB:Database Password=****1**")
Mcon.Con = New OleDb.OleDbConnection(Mcon.Str)
Mcon.Con.Open()

'连接到Mysql数据库
Imports MySql.Data.MySqlClient
'请先安装MySQL Connector Net 6.9.9,然后在项目->Net中添加引用MySql.Data
Dim Mycon As MySqlConnection
Dim Mycom As MySqlCommand
Mycon = New MySqlConnection("Data Source=127.0.0.1;User=root;Password=****1**;Database=Mydata")
Mycon.Open()

'连接到SqlServer
Imports System.Data.SqlClient
Dim Mycon As New SqlConnection("uid=sa;pwd=****1**;database=hjerp;server=(local)")
Mycon.Open()

'读取app.config中数据库连接,注意2个引用
Mycon.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings.Item(1).ToString()
Mycon.Open()