日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

ADO.NET- 基础总结及实例

發(fā)布時(shí)間:2023/12/19 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ADO.NET- 基础总结及实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、ADO.NET基礎(chǔ)介紹

?(1、程序要和數(shù)據(jù)庫(kù)交互要通過ADO.NET進(jìn)行,通過ADO.NET就能在程序中執(zhí)行SQL了。ADO.Net中提供了對(duì)各種不同數(shù)據(jù)庫(kù)的統(tǒng)一操作接口。

? ?(2、直接在項(xiàng)目中內(nèi)嵌mdf文件的方式使用SQL Server數(shù)據(jù)庫(kù)(基于服務(wù)的數(shù)據(jù)庫(kù))。mdf文件隨著項(xiàng)目走,用起來(lái)方便,和在數(shù)據(jù)庫(kù)服務(wù)器上創(chuàng)建數(shù)據(jù)庫(kù)沒什么區(qū)別,運(yùn)行的時(shí)候會(huì)自動(dòng)附加(Attach)。

?(3、雙擊mdf文件會(huì)在“服務(wù)器資源管理器”中打開,管理方式和在Mnagemen Studio沒什么本質(zhì)不同,要拷貝mdf?文件需要關(guān)閉所有指向mdf文件的連接。

?(4、正式生產(chǎn)運(yùn)行的時(shí)候附加到SQLServer上、修改連接字符串即可,除此之外沒有任何的區(qū)別,在“數(shù)據(jù)庫(kù)”節(jié)點(diǎn)上點(diǎn)右鍵“附加”;在數(shù)據(jù)庫(kù)節(jié)點(diǎn)上à任何à分離?就可以得到可以拷來(lái)拷去mdf?文件。

?(5、用的時(shí)候要在控制臺(tái)、WinForm項(xiàng)目中的Main函數(shù)最開始的位置加入“一段神奇的代碼"。ASP.Net項(xiàng)目中不需要

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data.SqlClient; 6 7 namespace myadonet 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //神奇代碼 14 string dateDir = AppDomain.CurrentDomain.BaseDirectory; 15 if (dateDir.EndsWith(@"\bin\Debug\") 16 || dateDir.EndsWith(@"\bin\Release\")) 17 { 18 dateDir = System.IO.Directory.GetParent(dateDir).Parent.Parent.FullName; 19 AppDomain.CurrentDomain.SetData("DataDirectory", dateDir); 20 } 21 22 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")) 23 { 24 conn.Open(); 25 26 Console.WriteLine("連接成功!"); 27 Console.ReadKey(); 28 } 29 } 30 }

?

2、連接到SQLServer數(shù)據(jù)庫(kù)

? ? ? ?(1、連接字符串:程序通過連接字符串?指定要連哪臺(tái)服務(wù)器上的、哪個(gè)實(shí)例的哪個(gè)數(shù)據(jù)庫(kù)、用什么用戶名?密碼等。

? ? ? ?(2、項(xiàng)目?jī)?nèi)嵌mdf文件形式的連接字符串“Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Inte grated Security=True;User Intance=True”。“.SQLEXPRESS”表示本機(jī)上的SQLEXPRESS實(shí)例,如果數(shù)據(jù)庫(kù)實(shí)例名不是SQLEXPRESS,則需要修改。??Database1.mdf”為mdf的文件名。

? ? ? ?(3、ADO.Net中通過SQLConnection在創(chuàng)建SQLServer的連接,SQLConnection代表一個(gè)數(shù)據(jù)庫(kù)連接,ADO.Net中的連接等資源都實(shí)現(xiàn)了IDisposable接口,可以使用using進(jìn)行資源管理。執(zhí)行這段段代碼,如果成功了就OK

? ? ? ?(4、在實(shí)現(xiàn)了IDisposable接口的對(duì)象,在使用完后需要用行資源釋放

?

3、執(zhí)行簡(jiǎn)單的Insert語(yǔ)句

? ? (1、SQLCommand表示向服務(wù)器提交的一個(gè)命令(SQL語(yǔ)句等)。

? ? ? (2、CommandText屬性為要執(zhí)行的SQL語(yǔ)句,Execute NonQuery方法執(zhí)行一個(gè)非查詢語(yǔ)句UpdateinsetDelete等)

? ? ?(3、ExecuteNonQuery返回值是執(zhí)行的影響行數(shù)

在conn.open();下面敲上這樣一段代碼即可插入數(shù)據(jù)庫(kù)數(shù)據(jù):

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data.SqlClient; 6 7 namespace myadonet 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //神奇代碼 14 string dateDir = AppDomain.CurrentDomain.BaseDirectory; 15 if (dateDir.EndsWith(@"\bin\Debug\") 16 || dateDir.EndsWith(@"\bin\Release\")) 17 { 18 dateDir = System.IO.Directory.GetParent(dateDir).Parent.Parent.FullName; 19 AppDomain.CurrentDomain.SetData("DataDirectory", dateDir); 20 } 21 22 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")) 23 { 24 conn.Open(); 25 /* 插入數(shù)據(jù)* */ 26 using (SqlCommand commd = conn.CreateCommand()) { 27 commd.CommandText = "Insert into T_UserInfo (sUser,sPassWord) values('admin','888888')"; 28 commd.ExecuteNonQuery(); 29 Console.WriteLine("插入成功"); 30 } 31 32 33 } 34 35 Console.WriteLine("連接成功!"); 36 Console.ReadKey(); 37 } 38 } 39 }

?

4、模擬登陸

同樣在conn.open();下面敲上這樣一段代碼即可

View Code 1 bool flag = true; 2 while (flag) 3 { 4 Console.WriteLine("請(qǐng)輸入用戶名:"); 5 string sUser = Console.ReadLine(); 6 using(SqlCommand cmd=conn.CreateCommand()){ 7 cmd.CommandText = "Select * from T_UserInfo where sUser='"+sUser+"'"; 8 using (SqlDataReader reader = cmd.ExecuteReader()) { 9 if (reader.Read()) 10 { 11 Console.WriteLine("請(qǐng)輸入密碼:"); 12 string sPassWord = Console.ReadLine(); 13 string QueryPassWord=reader.GetString(reader.GetOrdinal("sPassWord")); 14 if (sPassWord == QueryPassWord) 15 { 16 Console.WriteLine("登陸成功!"); 17 flag = false; 18 } 19 else { 20 Console.WriteLine("密碼錯(cuò)誤"); 21 } 22 } 23 else { Console.WriteLine("用戶不存在,請(qǐng)重新輸入"); } 24 } 25 } 26 }

?

5、ExecuteScalar

? ? ? (1、SqlCommand中的ExecuteScalar方法用于執(zhí)行查詢,并返回查詢所返回的結(jié)果集中第一行的第一列,因?yàn)椴荒艽_定返回值的類型,所以,ExecuteScalar的返回值為object類型

? ? ?(2、得到自動(dòng)增長(zhǎng)字段的主鍵值,在values關(guān)鍵詞前加上output inserted.Id,其中Id為主鍵字段名。執(zhí)行結(jié)果就是插入的主鍵值,用ExecuteScalar執(zhí)行最方便。

?

View Code 1 using (SqlCommand cmd = conn.CreateCommand()) 2 { 3 cmd.CommandText = "Select * from T_UserInfo"; 4 using (SqlDataReader reader = cmd.ExecuteReader()) 5 { 6 while (reader.Read()) //這里得到一個(gè)bool值 7 { 8 string sUser = reader.GetString(reader.GetOrdinal("sUser")); 9 //int ID = reader.GetInt32(reader.GetOrdinal("ID")); 10 string sPassWord = reader.GetString(reader.GetOrdinal("sPassword")); //多行結(jié)果集 11 Console.WriteLine("{0}{1}", sUser, sPassWord); 12 13 } 14 } 15 }

?

?(3、執(zhí)行有多行結(jié)果集的用?ExecuteReader:讀到最后一條數(shù)據(jù)返回false

? ? ? ? ??readerGetStringGetInt32等方法只接受整數(shù)參數(shù),也就是序號(hào),用GetOrdinal方法根據(jù)列名動(dòng)態(tài)得到序號(hào)了。

View Code 1 /*最佳登陸方式*/ 2 bool flag = true; 3 while (flag) 4 { 5 Console.WriteLine("請(qǐng)輸入用戶名:"); 6 string sUser = Console.ReadLine(); 7 using (SqlCommand cmd = conn.CreateCommand()) 8 { 9 cmd.CommandText = "Select * from T_UserInfo where sUser='" + sUser + "'"; 10 using (SqlDataReader reader = cmd.ExecuteReader()) 11 { 12 if (reader.Read()) 13 { 14 Console.WriteLine("請(qǐng)輸入密碼:"); 15 string sPassWord = Console.ReadLine(); 16 string QueryPassWord = reader.GetString(reader.GetOrdinal("sPassWord")); 17 if (sPassWord == QueryPassWord) 18 { 19 Console.WriteLine("登陸成功!"); 20 flag = false; 21 } 22 else 23 { 24 Console.WriteLine("密碼錯(cuò)誤"); 25 } 26 } 27 else { Console.WriteLine("用戶不存在,請(qǐng)重新輸入"); } 28 } 29 } 30 }

?

6、為什么用using?? ? ??

? ? ? ? ?Close:關(guān)閉以后還能打開。??Dispose:直接銷毀,不能再次使用。

? ? ? ? ?Using在出了作用域以后調(diào)用DisposeSqlConnection?FileStream?等的Dispose內(nèi)部都會(huì)做這樣的判斷:判斷有沒有close,如果沒有,就

CloseDispose

7、SQL注入漏洞攻擊/參數(shù)化查詢

? ? ? ?**例如第4點(diǎn)所說(shuō)的登錄判斷:select count(*)?from T_Users where sUser=…and Password=…,將參數(shù)拼到SQL語(yǔ)句中。

? ? ? ? ? ?我們可以通過構(gòu)造惡意的sPassword輸入 ? ? 1`or`1`=`1

? ? ? ? ? ?編譯通過后識(shí)別出來(lái)的就是:select count(*) from T_Users where sUser= ‘a(chǎn)dmin’ and Password=‘1`or`1`=`1’

? ? ? **參數(shù)化查詢解決漏洞攻擊

? ? ? ? ? ?SQL語(yǔ)句使用@sUser表示“此處用參數(shù)代替”,向SqlCommandParameters中添加參數(shù)。

View Code 1 cmd.CommandText = "select count(*)from T_Users where sUser =@UN and sPassword=@PW"; 2 3 cmd.Parameters.Add(new SqlParameter("UN", sUser)); 4 5 cmd.Parameters.Add(new SqlParameter("PW", sPassword));

?

? ? ? ? ? ?參數(shù)在SQLServer內(nèi)部不是簡(jiǎn)單的字符串替換,SQLServer直接用添加的值進(jìn)行數(shù)據(jù)比較,因此不會(huì)有注入漏洞攻擊。

?8、模擬窗體登陸,并且設(shè)置登陸錯(cuò)誤次數(shù)

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Data.SqlClient; 10 11 namespace myAdoNet02 12 { 13 public partial class Form1 : Form 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 private void IntsErrorTime() 21 { 22 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf; 23 Integrated Security=True;Connect Timeout=30;User Instance=True")) 24 { 25 conn.Open(); 26 using (SqlCommand cmd = conn.CreateCommand()) 27 { 28 using (SqlCommand updateCmd = conn.CreateCommand()) 29 { 30 //假如用戶輸入的用戶名和密碼錯(cuò)誤次數(shù)過多,則將數(shù)據(jù)庫(kù)中的錯(cuò)誤記錄次數(shù)加1 31 updateCmd.CommandText = "update T_UserInfo Set sErrorTime=sErrorTime+1 where sUser=@sUser"; 32 updateCmd.Parameters.Add(new SqlParameter("sUser", textBox1.Text)); 33 updateCmd.ExecuteNonQuery(); 34 } 35 } 36 } 37 } 38 private void ResetsErrorTime() 39 { 40 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\UsersDB.mdf; 41 Integrated Security=True;Connect Timeout=30;User Instance=True")) 42 { 43 conn.Open(); 44 using (SqlCommand cmd = conn.CreateCommand()) 45 { 46 using (SqlCommand updateCmd = conn.CreateCommand()) 47 { 48 //假如用戶輸入的用戶名和密碼均正確,則將數(shù)據(jù)庫(kù)的錯(cuò)誤次數(shù)歸0,重新統(tǒng)計(jì)。 49 updateCmd.CommandText = "update T_UserInfo Set sErrorTime=0 where sUser=@sUser"; 50 updateCmd.Parameters.Add(new SqlParameter("sUser", textBox1.Text)); 51 updateCmd.ExecuteNonQuery(); 52 } 53 } 54 } 55 } 56 private void button1_Click(object sender, EventArgs e) 57 { 58 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\UsersDB.mdf; 59 Integrated Security=True;Connect Timeout=30;User Instance=True")) 60 { 61 conn.Open(); 62 using (SqlCommand cmd = conn.CreateCommand()) 63 { 64 cmd.CommandText = "Select * from T_UserInfo where sUser=@sUser";//加"@"參數(shù)化查詢 65 cmd.Parameters.Add(new SqlParameter("sUser", textBox1.Text)); 66 using (SqlDataReader reader = cmd.ExecuteReader()) 67 { 68 if (reader.Read()) 69 { 70 int errorTimes = reader.GetInt32(reader.GetOrdinal("sErrorTime")); 71 if (errorTimes > 3) 72 { 73 MessageBox.Show("錯(cuò)誤次數(shù)過多,請(qǐng)三小時(shí)后再登錄"); 74 return; 75 } 76 string dbpassword = reader.GetString(reader.GetOrdinal("Password")); 77 if (dbpassword == textBox2.Text) 78 { 79 ResetsErrorTime(); 80 MessageBox.Show("登錄成功!"); 81 } 82 else 83 { 84 //在同一個(gè)連接中,如果SqlDataReader沒有關(guān)閉,那么是不能執(zhí)行Update之類的語(yǔ)句的, 85 //因此,Update語(yǔ)句要放在其它函數(shù)內(nèi)。 86 IntsErrorTime();//調(diào)用此方法即可 87 MessageBox.Show("登錄失敗!"); 88 } 89 } 90 else 91 { 92 MessageBox.Show("用戶名不存在!"); 93 } 94 } 95 } 96 } 97 } 98 } 99 }

?

9、導(dǎo)入導(dǎo)出數(shù)據(jù)案例

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.IO; 10 using System.Data.SqlClient; 11 12 namespace myAdoNet02 13 { 14 public partial class Form2 : Form 15 { 16 public Form2() 17 { 18 InitializeComponent(); 19 } 20 21 private void button1_Click(object sender, EventArgs e) 22 { 23 //單純從button中的name屬性objImport得到ShowDialog()方法是不科學(xué)的 24 // 25 OpenFileDialog objImport = new OpenFileDialog(); 26 if (objImport.ShowDialog() != DialogResult.OK) 27 { 28 return; 29 } 30 using (FileStream filestream = File.OpenRead(objImport.FileName)) 31 { 32 using (StreamReader streamreader = new StreamReader(filestream)) 33 { 34 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf; 35 Integrated Security=True;Connect Timeout=30;User Instance=True")) 36 { 37 //創(chuàng)建連接是很耗時(shí)的,所以不能每插入一條數(shù)據(jù)就創(chuàng)建一次連接 38 conn.Open(); 39 using (SqlCommand cmd = conn.CreateCommand()) 40 { 41 cmd.CommandText = "insert into T_UserInfo(sUser,sPassWord) values(@sUser,@sPassWord)"; 42 string line = null; 43 while ((line = streamreader.ReadLine()) != null) 44 { 45 string[] str = line.Split('|'); 46 string sUser = str[0]; 47 string sPassWord = str[1]; 48 cmd.Parameters.Clear(); 49 //參數(shù)不能重復(fù)添加,在本while中用的是同一個(gè)SqlCommand對(duì)象,所以要在用完一次后,清除參數(shù) 50 cmd.Parameters.Add(new SqlParameter("sUser", sUser)); 51 cmd.Parameters.Add(new SqlParameter("sPassWord", sPassWord)); 52 cmd.ExecuteNonQuery(); 53 } 54 } 55 } 56 } 57 MessageBox.Show("導(dǎo)入成功"); 58 } 59 } 60 } 61 }

?

10、手機(jī)號(hào)碼歸屬地查詢省市下拉列表實(shí)例

? ?(1、數(shù)據(jù)庫(kù)資源-全國(guó)省市數(shù)據(jù)庫(kù) :http://www.programfan.com/blog/article.asp?id=28128

? ?(2、數(shù)據(jù)庫(kù)連接:大概有兩種形式

<add key="" value /?
<add name="" connectonstring="" /?
這兩方法對(duì)應(yīng)的后臺(tái)訪問方式不一樣的
第一種:System.Configuration.ConfigurationManager.AppSettings["myConn"]
第二種:ConfigurationManager.ConnectionStrings["myConn"].ConnectionString

? ?(3、要在類庫(kù)中找到ConfigurationManager.ConnectionStrings需要添加System.configuration

? (4、遇到一個(gè)問題,是這樣,因?yàn)橥粋€(gè)解決方案里我建立了多個(gè)項(xiàng)目,項(xiàng)目中基于數(shù)據(jù)庫(kù)服務(wù)文件名字起的差不多(我都是沒改名,自動(dòng)生成的名字),所以導(dǎo)致后

面在生成調(diào)試的時(shí)候,總是遇到“數(shù)據(jù)庫(kù)未創(chuàng)建實(shí)例”這樣的錯(cuò)誤。

?下面是手機(jī)號(hào)碼歸屬地查詢省市下拉列表實(shí)例:

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Data.SqlClient; 10 using System.Configuration; 11 12 namespace myAdoNet02 13 { 14 public partial class Form3 : Form 15 { 16 public Form3() 17 { 18 InitializeComponent(); 19 } 20 //初始化 21 22 private void Form3_Load(object sender, EventArgs e) 23 { 24 string myconStr = ConfigurationManager.ConnectionStrings["myConStr"].ConnectionString; 25 26 using (SqlConnection conn = new SqlConnection(myconStr)) 27 { 28 conn.Open(); 29 using (SqlCommand cmd = conn.CreateCommand()) { 30 cmd.CommandText = "select * from promary"; 31 using (SqlDataReader reader = cmd.ExecuteReader()) { 32 while (reader.Read()) { 33 //構(gòu)造model類 34 Promary p = new Promary(); 35 //將數(shù)據(jù)庫(kù)中的數(shù)據(jù)賦值給model類中的屬性值 36 p.ID = reader.GetInt32(reader.GetOrdinal("proID")); 37 p.sName = reader.GetString(reader.GetOrdinal("proName")); 38 Console.WriteLine(p.ID); 39 Console.WriteLine(p.sName); 40 Console.WriteLine(p); 41 省.Items.Add(p); 42 } 43 } 44 } 45 } 46 } 47 //選擇省后,查看市 48 private void 省_SelectedIndexChanged(object sender, EventArgs e) 49 { 50 市.Items.Clear();//清楚舊數(shù)據(jù) 51 Promary p2 = (Promary)省.SelectedItem; 52 int proID = p2.ID; 53 54 string myConStr = ConfigurationManager.ConnectionStrings["myConStr"].ConnectionString; 55 using (SqlConnection conn = new SqlConnection(myConStr)) 56 { 57 conn.Open(); 58 using(SqlCommand cmd=conn.CreateCommand()){ 59 cmd.CommandText = "select * from city where proID=@ID"; 60 cmd.Parameters.Add(new SqlParameter("ID", proID)); 61 using (SqlDataReader reader = cmd.ExecuteReader()) { 62 while (reader.Read()) { 63 string sCityName = reader.GetString(reader.GetOrdinal("cityName")); 64 市.Items.Add(sCityName); 65 } 66 } 67 } 68 } 69 } 70 71 class Promary 72 { 73 //下拉框的DisplayMember要設(shè)置為sName,才能顯示出來(lái) 74 public string sName { set; get; } 75 public int ID { set; get; } 76 } 77 78 } 79 }

?

配置文件App.config

View Code 1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <connectionStrings> 4 <add name="myConStr" connectionString="Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf; 5 Integrated Security=True;Connect Timeout=30;User Instance=True"/> 6 </connectionStrings> 7 </configuration>

?

11、手機(jī)號(hào)碼歸屬地查詢

?后臺(tái)代碼:

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Data.SqlClient; 10 using System.Configuration; 11 using System.IO; 12 13 namespace 手機(jī)歸屬地導(dǎo)入查詢 14 { 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 22 private void button1_Click(object sender, EventArgs e) 23 { 24 25 FolderBrowserDialog dlg = new FolderBrowserDialog(); 26 if (dlg.ShowDialog() != DialogResult.OK) 27 { 28 return; 29 } 30 string path = dlg.SelectedPath; 31 //清除數(shù)據(jù) 32 String connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; 33 using (SqlConnection conn = new SqlConnection(connStr)) 34 { 35 conn.Open(); 36 using (SqlCommand cmd = conn.CreateCommand()) 37 { 38 cmd.CommandText = "delete from T_PhoneInfo"; 39 cmd.ExecuteNonQuery(); 40 } 41 } 42 43 44 MessageBox.Show("11!"); 45 string[] files = Directory.GetFiles(path, "*.txt", SearchOption.AllDirectories); 46 47 using (SqlConnection conn = new SqlConnection(connStr)) 48 { 49 conn.Open(); 50 using (SqlCommand cmd = conn.CreateCommand()) 51 { 52 cmd.CommandText = "Insert into T_PhoneInfo(sEndNo,sName,sStartNo) values(@sEndNo,@sName,@sStartNo)"; 53 54 foreach (string file in files)//遍歷文件名 55 { 56 string 運(yùn)營(yíng)商名稱 = Path.GetFileNameWithoutExtension(file); 57 //不用StreamReader,因?yàn)槲募苄?#xff0c; 58 string[] lines = File.ReadAllLines(file, Encoding.Default); 59 //一次性加載,也不占多少內(nèi)存,ReadAllLines默認(rèn)編碼是UTF-8 60 61 MessageBox.Show("22!"); 62 foreach (string line in lines) 63 { 64 string[] strs = line.Split('-'); 65 string 開始號(hào)碼 = strs[0]; 66 string 結(jié)束號(hào)碼 = strs[1]; 67 string 市 = strs[2]; 68 InsertExecuteNonQuery(結(jié)束號(hào)碼, 運(yùn)營(yíng)商名稱+市, 開始號(hào)碼); 69 } 70 } 71 } 72 } 73 MessageBox.Show("導(dǎo)入成功!"); 74 } 75 76 public int InsertExecuteNonQuery(string sEndNo, string sName, string sStartNo) 77 { 78 string sqlString = "Insert into T_PhoneInfo(sEndNo,sName,sStartNo) values(@sEndNo,@sName,@sStartNo)"; 79 String connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; 80 81 using (SqlConnection connetion = new SqlConnection(connStr)) 82 { 83 connetion.Open(); 84 using (SqlCommand Command = new SqlCommand(sqlString, connetion)) 85 { 86 SqlParameter[] param = new SqlParameter[] 87 { 88 new SqlParameter("@sEndNo", sEndNo), 89 new SqlParameter("@sName", sName), 90 new SqlParameter("@sStartNo", sStartNo) 91 92 }; 93 Command.Parameters.AddRange(param); 94 return Command.ExecuteNonQuery(); 95 } 96 } 97 } 98 } 99 }

?

program.cs

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Windows.Forms; 5 6 namespace 手機(jī)歸屬地導(dǎo)入查詢 7 { 8 static class Program 9 { 10 /// <summary> 11 /// 應(yīng)用程序的主入口點(diǎn)。 12 /// </summary> 13 [STAThread] 14 static void Main() 15 { 16 //(1)不要忘記把這段代碼放進(jìn)來(lái) 17 //一定要放在最開始,否則提示成功也沒有導(dǎo)入到數(shù)據(jù)庫(kù)中 18 //(2)數(shù)據(jù)庫(kù)表設(shè)置主鍵 19 string dataDir = AppDomain.CurrentDomain.BaseDirectory; 20 MessageBox.Show(dataDir); 21 if (dataDir.EndsWith("\\bin\\Debug\\") 22 || dataDir.EndsWith("\\bin\\Release\\")) 23 { 24 //dataDir = System.IO.Directory.GetParent(dataDir).Parent.FullName; 25 dataDir=dataDir.Replace("\\bin\\Debug\\", ""); 26 MessageBox.Show(dataDir); 27 AppDomain.CurrentDomain.SetData("DataDirectory", dataDir); 28 } 29 30 Application.EnableVisualStyles(); 31 Application.SetCompatibleTextRenderingDefault(false); 32 Application.Run(new Form1()); 33 } 34 } 35 }

?

配置文件:
? ?DataDirectory路徑無(wú)法讀取到,因?yàn)樵贒Bbrowser里的mdf并不是debug中的mdf,所以改成絕對(duì)路就可以了

備注:如果配置文件不改為絕對(duì)路徑的話,需要改program.cs中

View Code 1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <connectionStrings> 4 <add name="ConnStr" connectionString="Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\phone.mdf; 5 Integrated Security=True;User Instance=True"/> 6 </connectionStrings> 7 </configuration> 8 <!--Connect Timeout=30;-->

?

12、DataSet的基本使用

? (1、封裝一個(gè)SQLHelper類:(用于被其它代碼調(diào)用,以下為該類的完整代碼)

***1、該類中含有四個(gè)方法,分別是:ExecuteNonQuery(string sql, params SqlParameter[] parameters)、ExecuteScalar(string sql, params

SqlParameter[] parameters)、ExecuteReader(string sql, params SqlParameter[] parameters)和ExecuteDataTable(string sql, params

SqlParameter[] parameters)。

在封裝這個(gè)類之前稱簡(jiǎn)單介紹幾點(diǎn):

a、封裝一個(gè)SQLHelper類方便使用,提供ExecuteNonQuery(string sql, params SqlParameter[] parameters);ExecuteScalar(string sql,

params SqlParameter[] parameters);ExecuteReader(string sql, params SqlParameter[] parameters);ExecuteDataTable(string sql,

params SqlParameter[] parameters)等方法,網(wǎng)上有微軟提供的最全的SQLHelper類,是Enterprise Library中的一部分。

b、用SQLHelper重寫登錄程序

c、new SqlParameter("e",0)的陷阱

d、sqlconnection在程序中一直保持它open可以嗎?對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),連接是非常寶貴的資源,一定要用完不close或dispose。

? ? ? ? ? ?***2、ExecuteScalar 和ExecuteNonQuery的區(qū)別

? ? ? ? ? ?a、ExecuteScala 返回r結(jié)果集中第一行的第一列或空引用(如果結(jié)果集為空),返回的是一個(gè)object

? ? ? ? ? ?b、ExecuteNonQuery針對(duì)Connection?執(zhí)行 SQL 語(yǔ)句并返回受影響的行數(shù),返回的是一個(gè)int型值。

?SQLHelp.cs

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data.SqlClient; 6 using System.Configuration; 7 using System.Data; 8 9 namespace 封裝 10 { 11 class SQLHelp 12 { 13 public static readonly string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; 14 /*優(yōu)點(diǎn):1、把數(shù)據(jù)庫(kù)連接代碼都放在SQLHelper中,使代碼更簡(jiǎn)潔 15 * 2、使用DataTable可以隨意讀取數(shù)據(jù)庫(kù),而之前做的用戶登錄使用的SqlReader只能逐行往前讀*/ 16 17 public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters) 18 { 19 using (SqlConnection conn = new SqlConnection(connStr)) 20 { 21 conn.Open(); 22 using (SqlCommand cmd = conn.CreateCommand()) 23 { 24 cmd.CommandText = sql; 25 foreach (SqlParameter parameter in parameters) 26 { 27 cmd.Parameters.Add(parameter); 28 } 29 return cmd.ExecuteNonQuery(); 30 } 31 } 32 } 33 34 public static object ExecuteScalar(string sql, params SqlParameter[] parameters) 35 { 36 string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; 37 using (SqlConnection conn = new SqlConnection(connStr)) 38 { 39 conn.Open(); 40 using (SqlCommand cmd = conn.CreateCommand()) 41 { 42 cmd.CommandText = sql; 43 foreach (SqlParameter parameter in parameters) 44 { 45 cmd.Parameters.Add(parameter); 46 } 47 //執(zhí)行查詢,并返回查詢所返回的結(jié)果集中第一行的第一列。忽略其它的行或列。 48 return cmd.ExecuteScalar(); 49 } 50 } 51 } 52 public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] parameters) 53 { 54 string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; 55 using (SqlConnection conn = new SqlConnection(connStr)) 56 { 57 conn.Open(); 58 using (SqlCommand cmd = conn.CreateCommand()) 59 { 60 cmd.CommandText = sql; 61 foreach (SqlParameter parameter in parameters) 62 { 63 cmd.Parameters.Add(parameter); 64 } 65 return cmd.ExecuteReader(); 66 } 67 } 68 } 69 public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters) 70 { 71 string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; 72 using (SqlConnection conn = new SqlConnection(connStr)) 73 { 74 conn.Open(); 75 using (SqlCommand cmd = conn.CreateCommand()) 76 { 77 cmd.CommandText = sql; 78 foreach (SqlParameter parameter in parameters) 79 { 80 cmd.Parameters.Add(parameter); 81 } 82 //執(zhí)行查詢,并返回查詢所返回的結(jié)果集中第一行的第一列。忽略其它的行或列。 83 DataSet dataset = new DataSet(); 84 SqlDataAdapter adapter = new SqlDataAdapter(cmd); 85 adapter.Fill(dataset); 86 return dataset.Tables[0]; 87 } 88 } 89 } 90 } 91 }

?

Form1.cs

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Configuration; 10 using System.Data.SqlClient; 11 using System.IO; 12 using 封裝.DataSet1TableAdapters; 13 14 namespace 封裝 15 { 16 public partial class Form1 : Form 17 { 18 public Form1() 19 { 20 InitializeComponent(); 21 } 22 23 private void button1_Click(object sender, EventArgs e) 24 { 25 //ExecuteNonQuery 插入數(shù)據(jù) 26 SQLHelp.ExecuteNonQuery("insert into T_PhoneInfo(sStartNo,sEndNo,sName) values(@sStartNo,@sEndNo,@sName)", new SqlParameter("sStartNo", "11"), new SqlParameter("sEndNo", "11"), new SqlParameter("sName", "gaug懂")); 27 MessageBox.Show("插入數(shù)據(jù)成功"); 28 } 29 30 private void button2_Click(object sender, EventArgs e) 31 { 32 //ExecuteScalar 查詢條數(shù) 33 object i = SQLHelp.ExecuteScalar("select count(*)from T_PhoneInfo"); 34 MessageBox.Show(Convert.ToString(i)); 35 } 36 37 private void button3_Click(object sender, EventArgs e) 38 { 39 //SqlDataReader 40 SqlDataReader reader = SQLHelp.ExecuteReader("select * from T_PhoneInfo"); 41 while (reader.Read()) 42 { 43 //運(yùn)行到這里報(bào)錯(cuò),因?yàn)楦鷶?shù)據(jù)庫(kù)的連接已關(guān)閉,利用DataSet可以解決這類問題 44 string sName = reader.GetString(reader.GetOrdinal("sName")); 45 } 46 } 47 48 private void button4_Click(object sender, EventArgs e) 49 { 50 //注意只有在小數(shù)據(jù)量的時(shí)候才往DataSet里放, 51 //因?yàn)镈ataSet要占內(nèi)存,大數(shù)據(jù)量的時(shí)候還是要用DataReader 52 string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; 53 //定義一個(gè)DataSet 54 DataSet dataset = new DataSet(); 55 //數(shù)據(jù)庫(kù)操作表 56 using (SqlConnection con = new SqlConnection(connStr)) 57 { 58 con.Open(); 59 using (SqlCommand cmd = con.CreateCommand()) 60 { 61 cmd.CommandText = "select * from T_PhoneInfo"; 62 SqlDataAdapter adapter = new SqlDataAdapter(cmd); //執(zhí)行select語(yǔ)句(要把cmd傳進(jìn)去) 63 adapter.Fill(dataset);//將執(zhí)行結(jié)果得到的數(shù)據(jù)填充到dataset中 64 } 65 } 66 //數(shù)據(jù)庫(kù)操作列 67 ///取dataset的表中的第0條數(shù)據(jù) 68 DataTable table = dataset.Tables[0]; 69 for (int i = 0; i < table.Rows.Count; i++) 70 { 71 DataRow row = table.Rows[i]; 72 string sName = Convert.ToString(row["sName"]); 73 MessageBox.Show(sName); 74 } 75 } 76 77 private void button5_Click(object sender, EventArgs e) 78 { 79 DataTable table = SQLHelp.ExecuteDataTable("select * from T_PhoneInfo"); 80 for (int i = 0; i < table.Rows.Count; i++) 81 { 82 DataRow row = table.Rows[i]; 83 string sName = Convert.ToString(row["sName"]); 84 MessageBox.Show(sName); 85 } 86 } 87 88 89 90 } 91 }

?

? ? ?(2、利用上述SQLHelper.cs類中的ExecuteDataTable(string sql, params SqlParameter[] parameters)方法,做一個(gè)登陸界面

?Form1.cs

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Configuration; 10 using System.Data.SqlClient; 11 using System.IO; 12 using 封裝.DataSet1TableAdapters; 13 14 namespace 封裝 15 { 16 public partial class Form1 : Form 17 { 18 public Form1() 19 { 20 InitializeComponent(); 21 } 22 23 private void button9_Click(object sender, EventArgs e) 24 { 25 //登陸 26 DataTable table = SQLHelp.ExecuteDataTable("select * from T_UserInfo where sUser=@sUser", new SqlParameter("sUser", txtUser.Text)); 27 if (table.Rows.Count <= 0) 28 { 29 MessageBox.Show("用戶名不存在"); 30 } 31 else 32 { 33 //用戶名存在,已經(jīng)知道是哪一列了,要返回的行是從零開始的索引 34 DataRow row = table.Rows[0]; 35 int sErroTime = Convert.ToInt32(row["sErroTime"]); 36 if (sErroTime > 3) 37 { 38 MessageBox.Show("登陸次數(shù)過多"); 39 return; 40 } 41 string sPassWord = Convert.ToString(row["sPassWord"]); 42 if (sPassWord == txtPassWord.Text) 43 { 44 SQLHelp.ExecuteNonQuery("update T_UserInfo set sErroTime=0 where sUser=@sUser", new SqlParameter("sUser", txtUser.Text)); 45 MessageBox.Show("登陸成功"); 46 } 47 else 48 { 49 SQLHelp.ExecuteNonQuery("update T_UserInfo set sErroTime=sErroTime+1 where sUser=@sUser", new SqlParameter("sUser", txtUser.Text)); 50 MessageBox.Show("密碼錯(cuò)誤!"); 51 } 52 53 } 54 } 55 56 } 57 }

?

? ?(3、

? ? ? ? ? ?**修改DataSet單擊事件如下:

a、可以更新行row["Name"]="sUser"、刪除行datatable.Rows.Remove()、新增行datatable.NewRow()。這一切都是修改的內(nèi)存中的DataSet,并沒

有修改數(shù)據(jù)庫(kù)。

b、可以調(diào)用SqlDataAdapter的Update方法將對(duì)DataSet的修改提交到數(shù)據(jù)庫(kù),Update方法有很多重載方法,可以提交整個(gè)DataSet、DataTable

或者若干DataRow。但是需要為SqlDataAdapter提供DeleteCommand、UpdateCommand、InsertCommand它才知道如何將對(duì)DataSet的修改提交

到數(shù)據(jù)庫(kù),由于這幾個(gè)Command要求的格式非常苛刻,因此開發(fā)人員自己寫非常困難;可以用SqlCommandBuilder自動(dòng)生成這幾個(gè)Command,

SqlCommandBuilder要求表必須有主鍵

c、通過DataRow的RowState可以獲得行的狀態(tài)(刪除、修改、新增等);調(diào)用DataSet的GetChanges()方法得到變化的結(jié)果集,降低傳遞的資源

? ? ? ? ? ?**測(cè)試強(qiáng)類型DataSet單擊事件

? ? ? ? ? ? ? ? 敲寫代碼前,還要添加一個(gè)數(shù)據(jù)集DataSet1.xsd文件,然后打開數(shù)據(jù)集,將表拖到數(shù)據(jù)集中:

View Code 1 private void button6_Click(object sender, EventArgs e) 2 { 3 //陷阱 4 //實(shí)參為0與不為0時(shí),這兩種情況下將光標(biāo)放在SqlParameter中按F12轉(zhuǎn)到定義就出現(xiàn)不同的重載函數(shù)的情況, 5 //非常詭異類型轉(zhuǎn)換陷阱! 6 SQLHelp.ExecuteDataTable("select * from T_Users where Id=@Id", new SqlParameter("Id", (object)0)); 7 //修改方法是在0前加上object 8 } 9 10 11 12 private void button7_Click(object sender, EventArgs e) 13 { 14 //修改DataSet 15 DataSet dataset = new DataSet(); 16 string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; 17 using (SqlConnection conn = new SqlConnection(connStr)) 18 { 19 conn.Open(); 20 using (SqlCommand cmd = conn.CreateCommand()) 21 { 22 cmd.CommandText = "select * from T_UserInfo"; 23 SqlDataAdapter adapter = new SqlDataAdapter(cmd); 24 adapter.Fill(dataset); 25 26 //修改Dataset中的數(shù)據(jù) 27 DataTable talbe = dataset.Tables[0]; 28 DataRow row = talbe.Rows[0]; 29 row["sUser"] = "lcy"; 30 31 talbe.Rows.RemoveAt(1);//刪除一行 32 DataRow otherRow = talbe.NewRow();//新加一行 33 //自動(dòng)生成更新語(yǔ)句 34 SqlCommandBuilder builder = new SqlCommandBuilder(adapter); 35 //更新DataSet,同步DataSet中的數(shù)據(jù)到數(shù)據(jù)庫(kù) 36 adapter.Update(dataset); 37 } 38 //對(duì)于不返回任何鍵列信息的 SelectCommand,不支持 UpdateCommand 的動(dòng)態(tài) SQL 生成。 39 //解決方案:表要設(shè)置主鍵 40 } 41 42 } 43 44 private void button8_Click(object sender, EventArgs e) 45 { 46 //測(cè)試強(qiáng)類型DataSet 47 T_UserInfoTableAdapter adapter = new T_UserInfoTableAdapter(); 48 封裝.DataSet1.T_UserInfoDataTable data = adapter.GetData(); //獲取數(shù)據(jù) 49 50 for (int i = 0; i < data.Count; i++) 51 { 52 封裝.DataSet1.T_UserInfoRow userRow = data[i]; 53 MessageBox.Show(userRow.sUser); 54 } 55 }

?(4 、可空數(shù)據(jù)類型

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 可空數(shù)據(jù)類型 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 string s1 = null; 13 //int i1=null; 14 int? i2 = 0; 15 int? i3 = null;//int? →可空的int,解決數(shù)據(jù)庫(kù)和C#對(duì)于int是否可以為null的不同所設(shè)置的 16 if (i3 == null) 17 { 18 Console.WriteLine("i3為空"); 19 } 20 else 21 { 22 i3++; 23 int i4 = (int)i3; //將可空的數(shù)據(jù)賦給不可空的,會(huì)報(bào)錯(cuò),加(int)i3以保證i3一定不為空 24 Console.WriteLine("i3不為空,i3++={0}", i3); 25 } 26 if (i3.HasValue) 27 { 28 int i4 = i3.Value; 29 Console.WriteLine("i3不為空"); 30 } 31 else 32 { 33 Console.WriteLine("i3為空"); 34 } 35 int i6 = 10; 36 int? i5 = i6; //將不可空的賦給可空的,不會(huì)報(bào)錯(cuò) 37 } 38 }

?(5、強(qiáng)類型DataSet判斷數(shù)據(jù)庫(kù)字段是否為null,強(qiáng)類型DataSet登陸,數(shù)據(jù)庫(kù)連接的連續(xù)性

View Code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using 封裝.DataSet1TableAdapters; 10 using System.Diagnostics; 11 12 namespace 封裝 13 { 14 public partial class Form2 : Form 15 { 16 public Form2() 17 { 18 InitializeComponent(); 19 } 20 21 private void button1_Click(object sender, EventArgs e) 22 { 23 //判斷數(shù)據(jù)庫(kù)字段是否為空 24 T_UserInfoTableAdapter adapter = new T_UserInfoTableAdapter(); 25 封裝.DataSet1.T_UserInfoDataTable table = adapter.GetData(); 26 封裝.DataSet1.T_UserInfoRow row = table[1]; 27 28 if (row.IssPassWordNull()) 29 { 30 table[1].sPassWord = "888888"; 31 adapter.Update(table); 32 MessageBox.Show("密碼為空,已重置密碼"); 33 } 34 else { 35 MessageBox.Show("密碼為:"+table[0].sPassWord); 36 } 37 38 } 39 40 private void button2_Click(object sender, EventArgs e) 41 { 42 //DataSet 密碼登陸 43 T_UserInfoTableAdapter adapter = new T_UserInfoTableAdapter(); 44 封裝.DataSet1.T_UserInfoDataTable table = adapter.GetDataByUser(txtUser.Text); 45 46 if (table.Count <= 0) 47 { 48 MessageBox.Show("用戶不存在"); 49 } 50 else { 51 封裝.DataSet1.T_UserInfoRow row = table[0]; 52 if (row.sErroTime > 3) 53 { 54 MessageBox.Show("登陸次數(shù)過多"); 55 return; 56 } 57 else { 58 if (row.sPassWord == txtPassWord.Text) 59 { 60 adapter.UpdateErrorTimeBack(row.sUser); 61 MessageBox.Show("登陸成功"); 62 } 63 else { 64 adapter.UpdateErrorTimeAdd(row.sUser); 65 MessageBox.Show("登陸失敗,密碼錯(cuò)誤"); 66 } 67 } 68 } 69 70 } 71 72 private void button3_Click(object sender, EventArgs e) 73 { 74 75 Stopwatch gameTime = new Stopwatch(); 76 gameTime.Start(); 77 T_UserInfoTableAdapter adapter = new T_UserInfoTableAdapter(); 78 79 /*慢方法:數(shù)據(jù)連接是間斷的 80 for (int i = 0; i < 3000; i++) 81 { 82 adapter.Insert(i.ToString(),i.ToString(),0); 83 }*/ 84 85 /*快方法:數(shù)據(jù)連接是連續(xù)的*/ 86 adapter.Connection.Open(); 87 for (int i = 0; i < 3000; i++) 88 { 89 //先刪除上個(gè)例子的數(shù)據(jù) adapter.Delete(i.ToString(), i.ToString(), 0); 90 adapter.Insert(i.ToString(), i.ToString(), 0); 91 } 92 adapter.Connection.Close(); 93 94 gameTime.Stop(); 95 96 MessageBox.Show(gameTime.Elapsed.ToString()); 97 } 98 99 } 100 }

?

?

?

?

?

?

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/daomul/archive/2013/04/17/3021929.html

總結(jié)

以上是生活随笔為你收集整理的ADO.NET- 基础总结及实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。