winform
一、cmd.ExcuteNonQuery()产生Connection must be valid and open.的问题
MySqlCommand cmd = new MySqlCommand(cmdString,cnn);
cnn是MySqlConnection类型的参数,不能丢
二、在dgv中活动鼠标所选中单元格的列名
this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText
三、MySQL的数据库操作
1、读取
string constructorString = "server=localhost;port=3306;user=root;password=000000;Database=managesys";
MySqlConnection myConnnect = new MySqlConnection(constructorString);
myConnnect.Open();
MySqlCommand myCmd = new MySqlCommand("select*from student", myConnnect);
Console.WriteLine(myCmd.CommandText);
MySqlDataReader reader = myCmd.ExecuteReader();
while(reader.Read()!=false)
{
for(int i = 0; i < 6; i++)
{
MessageBox.Show(reader[i].ToString());
}//一次读一格
}
myCmd.Dispose();
myConnnect.Close()
2、其他指令
string constructorString = "server=localhost;port=3306;user=root;password=000000;Database=managesys";
MySqlConnection myConnnect = new MySqlConnection(constructorString);
myConnnect.Open();
MySqlCommand myCmd = new MySqlCommand("alter table student drop column address", myConnnect);
Console.WriteLine(myCmd.CommandText);
myCmd.ExcuteNonQuery();
myCmd.Dispose();
myConnect.Close();
四、读取datagridview中空的cell时会报未指定对象
先用if(datagridview.Rows[index].Cells[index2].Value == null)判断
如果是空的,就向要导出的字符串数组中赋值“ ”
如果非空就赋值datagridview.Rows[index].Cells[index2].Value.ToString();
MySQL的unique约束
MySQL单列UNIQUE约束在列后声明:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
命名约束并且添加多个UNIQUE
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
添加约束
ALTER TABLE Persons
ADD UNIQUE (P_Id)
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
撤销 UNIQUE 约束
如需撤销 UNIQUE 约束,请使用下面的 SQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
用OleDB来读取Excel
项目需要我读取一个Excel表格,网上的方法就是将Excel作为数据源,使用OleDB读取。
按我的了解,OleDB是一个用于数据处理的接口,它位于ODBC上层,应用程序下层,可以用来读取和操作包括但不止于数据库的多种数据源。
以下是网上的方法:
把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:
public DataSet ExcelToDS(string Path)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;
DataSet ds = null;
strExcel="select * from [sheet1$]";
myCommand = new OleDbDataAdapter(strExcel, strConn);
ds = new DataSet();
myCommand.Fill(ds,"table1");
return ds;
}
//对于EXCEL中的表即sheet([sheet1$])如果不是固定的可以使用下面的方法得到
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,null);
string tableName=schemaTable.Rows[0][2].ToString().Trim();
-
这个方法的返回值是DataSet,它是一个数据集合,保存读取到的数据,类似一个独立的小数据库,里面有DataTable这种表,也有行列的概念
介绍原贴参考https://blog.csdn.net/liucherish/article/details/52808173 -
对于不同的.net数据提供者,ADO.NET采用不同的Connection对象连接数据库。
Connection类有四种:SqlConnection,OleDbConnection,OdbcConnection和OracleConnection。
OleDbConneetion连接支持OLE DB的数据库,如Access
详情见https://www.cnblogs.com/vaevvaev/p/6873367.html -
ADO.Net的数据访问对象有Connection,Command、DataReader和DataAdaper等
OLEDB.NET数据提供程序的命名空间是System.Data.OleDb,用之前要using一下- 使用OleDbConnection类的对象标识与一个数据库的物理连接,DataSource 获取数据源的服务器名或文件名 ,Provider 获取在连接字符串的“Provider = ” 子句中指定的OLEDB提供程序的名称,Extend Properties是扩展属性
- DataAdapter表示一组 SQL 命令和一个数据库连接,它们用于填充 DataSet和更新数据源,Fill方法填充DataSet
- 例子上写的一个4.0版本和一个8.0版本是老式的xls,如果要用新版xlsx,就要改成Ace.OLEDB.12.0和12.0(运行估计会报错,搜索报的错去加装驱动和修改IIS就行)
- 那个select * from [sheet1$ ]是跑不出来的,那个sheet1改成你表的名字,比如[myTable$A15:N34],A15:N34是选取范围,系统会自动把第一行当成列名
另外:也可进行写入EXCEL文件,实例如下:(我没跑过)
public void DSToExcel(string Path,DataSet oldds)
{
//先得到汇总EXCEL的DataSet 主要目的是获得EXCEL在DataSet中的结构
string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source ="+path1+";Extended Properties=Excel 8.0" ;
OleDbConnection myConn = new OleDbConnection(strCon) ;
string strCom="select * from [Sheet1$]";
myConn.Open ( ) ;
OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom, myConn ) ;
ystem.Data.OleDb.OleDbCommandBuilder builder=new OleDbCommandBuilder(myCommand);
//QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。
builder.QuotePrefix="["; //获取insert语句中保留字符(起始位置)
builder.QuoteSuffix="]"; //获取insert语句中保留字符(结束位置)
DataSet newds=new DataSet();
myCommand.Fill(newds ,"Table1") ;
for(int i=0;i<oldds.Tables[0].Rows.Count;i++)
{
//在这里不能使用ImportRow方法将一行导入到news中,因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。
在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added
DataRow nrow=aDataSet.Tables["Table1"].NewRow();
for(int j=0;j<newds.Tables[0].Columns.Count;j++)
{
nrow[j]=oldds.Tables[0].Rows[i][j];
}
newds.Tables["Table1"].Rows.Add(nrow);
}
myCommand.Update(newds,"Table1");
myConn.Close();
}
List的操作
一、addRange(List list2)方法,可以把其他的集合拼到本List的末尾
二、将List<string>中的字符串用逗号拼接成一个长字符串
利用string[] 类型的join()方法.
string strTemp1 = string.Join(",", list.ToArray());
MySQL的Insert into
MySql不支持select into语句
但是它有 insert into table_name1
select column_names from table_name2;
select into会自动创建新表
insert into需要一个已存在的表
两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建;insert into select from 要求目标表存在。
1.复制表结构及其数据:
create table table_name_new as select * from table_name_old
2.只复制表结构:
create table table_name_new as select * from table_name_old where 1=2;
或者:create table table_name_new like table_name_old
3.只复制表数据:
如果两个表结构一样:
insert into table_name_new select * from table_name_old
如果两个表结构不一样:
insert into table_name_new(column1,column2…) select column1,column2… from table_name_old
concat和加号的使用注意
concat(col1,col2)函数可将几列的内容拼接在一起
注意!使用concat的时候,如果有一列的值是空值,拼出来的结果也是空值
使用加法计算数字时,如果有一列的值是null,结果就是null
用case when 和IFNULL解决 读取数据库时读取到的某单元格为null的情况
case when语句与IFNULL函数
- case when middle_exercise_frequency is null then 0 else 1 end
s null也可以替换成 =1 =100 =5050等等条件
意思是,middle_exercise_frequency是null的时候,这句的值是0,否则是1 - 相似可以判断是否为空的方法是IFNULL(exp1,exp2) 如果exp1非空,式子的值就是exp1的值,否则是exp2的值
- 上面两个其实可以很好地解决一、二的问题,比如将concat和‘+‘运算的表达式更换为’’IFNULL(exp,‘defalutvalue’),来保证计算结果不会空值,case when同理
例如
select id,concat(IFNULL(light_exercise_type,'defaultvalue'),',',IFNULL(middle_exercise_type,'defaultvalue'),',',IFNULL(heavy_exercise_type,'defaultvalue')) as aero_type, (IFNULL(light_exercise_frequency,0) +IFNULL(middle_exercise_frequency,0) +IFNULL(heavy_exercise_frequency,0)) /((case when light_exercise_frequency is null then 0 else 1 end) +(case when middle_exercise_frequency is null then 0 else 1 end) +(case when heavy_exercise_frequency is null then 0 else 1 end) ) as aere_freq FROM tb_questionnaire_activity_habit GROUP BY id
查看表的列名及确定表中是否存在某列,不存在就增加该列
查询表的列名是否有目标列
select COLUMN_NAME from information_schema.COLUMNS
where table_name = 'tb_name' and COLUMN_NAME = 'column_name';
如果不存在,就增加该列
一开始在写这个逻辑的时候在网上找了一万个帖子,都是用if not exists(select…),但是MySql根本跑不出来啊!然后每个数据库存放表信息的位置也不一样,MySql的就在information_schema里,所以不是网上代码都能用。。