C#做小工具的时候碰到的问题

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一下

    1. 使用OleDbConnection类的对象标识与一个数据库的物理连接,DataSource 获取数据源的服务器名或文件名 ,Provider 获取在连接字符串的“Provider = ” 子句中指定的OLEDB提供程序的名称,Extend Properties是扩展属性
    2. DataAdapter表示一组 SQL 命令和一个数据库连接,它们用于填充 DataSet和更新数据源,Fill方法填充DataSet
    3. 例子上写的一个4.0版本和一个8.0版本是老式的xls,如果要用新版xlsx,就要改成Ace.OLEDB.12.0和12.0(运行估计会报错,搜索报的错去加装驱动和修改IIS就行)
    4. 那个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里,所以不是网上代码都能用。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值