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 PersonsADD UNIQUE (P_Id)如需命名 UNIQUE 約束,并定義多個列的 UNIQUE 約束,請使用下面的 SQL 語法:
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)撤銷 UNIQUE 約束
如需撤銷 UNIQUE 約束,請使用下面的 SQL:
用OleDB來讀取Excel
項目需要我讀取一個Excel表格,網上的方法就是將Excel作為數據源,使用OleDB讀取。
按我的了解,OleDB是一個用于數據處理的接口,它位于ODBC上層,應用程序下層,可以用來讀取和操作包括但不止于數據庫的多種數據源。
以下是網上的方法:
把EXCEL文件當做一個數據源來進行數據的讀取操作,實例如下:
-
這個方法的返回值是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()方法.
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里,所以不是網上代碼都能用。。
總結
以上是生活随笔為你收集整理的C#做小工具的时候碰到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python+sklearn实现随机森林
- 下一篇: C# System.Windows.Fo