C# 操作Sql Server 学习总结
生活随笔
收集整理的這篇文章主要介紹了
C# 操作Sql Server 学习总结
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C#中產(chǎn)生SQL語(yǔ)句的幾種方式
(1)拼接產(chǎn)生SQL語(yǔ)句:
? ? ? ?string sql = "insert into czyb(yhm,mm,qx) values('" + txtName.Text + "','" + txtPassword.Text + "','" + cmbPriority.Text + "')";
? ? ? ?OleDbCommand cmd = new OleDbCommand(sql, conn);
? ? ? ?這種方法寫(xiě)法比較復(fù)雜,且安全性低,容易遭受SQL注入攻擊。
(2)用string.Format方法:
? ? ? string sql = string.Format("insert into czyb(yhm,mm,qx) values('{0}','{1}','{2}')", txtName.Text, txtPassword.Text, cmbPriority.Text);
? ? ? 只是可讀性?xún)?yōu)于第(1)種。
(3)用參數(shù)化SQL語(yǔ)句:
? ? ? string sql="insert into czyb(yhm,mm,qx) values (@yhm,@mm,@qx)";
? ? ? OleDbCommand cmd = new OleDbCommand();
? ? ? cmd.CommandText = sql;
? ? ? cmd.Parameters.AddWithValue("@yhm", txtName.Text);
? ? ? cmd.Parameters.AddWithValue("@mm", txtPassword.Text);
? ? ? cmd.Parameters.AddWithValue("@qx", cmbPriority.Text);
? ? ? cmd.Connection = conn;
? ? ? conn.Open();
? ? ? cmd.ExecuteNonQuery();
? ? ?代碼結(jié)構(gòu)清楚,對(duì)于不支持存儲(chǔ)過(guò)程的數(shù)據(jù)庫(kù)(如Access),推薦采用本方法。
(4)如果數(shù)據(jù)庫(kù)支持存儲(chǔ)過(guò)程(如SQL Server),可以調(diào)用存儲(chǔ)過(guò)程執(zhí)行SQL:
? ? ? ? SqlConnection conn = new SqlConnection(txtConn);
? ? ? ? SqlCommand cmd = new SqlCommand("SearchContact", conn); ?//存儲(chǔ)過(guò)程名稱(chēng)為SearchContact
? ? ? ? cmd.CommandType = CommandType.StoredProcedure;
? ? ? ? cmd.Parameters.Add("@name", SqlDbType.VarChar, 50); ? //傳入?yún)?shù)
? ? ? ? cmd.Parameters["@name"].Value = txtName.Text.Trim();
? ? ? ?由于存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)預(yù)編譯的,執(zhí)行效率高,推薦采用。
========
C#連接SQL Server數(shù)據(jù)庫(kù)代碼解析
連接字符串:
<connectionStrings>
<add name="conn" connectionString="user id=sa;Password=;initial catalog=Northwind;Server=YourSQLServer;Connect Timeout=30;" providerName="System.Data.SqlClient" />
</connectionStrings>
--------------------------------------------------------------------------------
參數(shù)介紹(注意:參數(shù)間用分號(hào)分隔):
"user id=sa":連接數(shù)據(jù)庫(kù)的驗(yàn)證用戶(hù)名為sa.他還有一個(gè)別名"uid",所以這句我們還可以寫(xiě)成"uid=sa".
"password=":連接數(shù)據(jù)庫(kù)的驗(yàn)證密碼為空.他的別名為"pwd",所以我們可以寫(xiě)為"pwd=".
這里注意,你的SQL Server必須已經(jīng)設(shè)置了需要用戶(hù)名和密碼來(lái)登錄,否則不能用這樣的方式來(lái)登錄.如果你的SQL Server設(shè)置為Windows登錄,那么在這里就不需要使用"user id"和"password"這樣的方式來(lái)登錄,而需要使用"Trusted_Connection=SSPI"來(lái)進(jìn)行登錄.
"initial catalog=Northwind":使用的數(shù)據(jù)源為"Northwind"這個(gè)數(shù)據(jù)庫(kù).他的別名為"Database",本句可以寫(xiě)成"Database=Northwind".
"Server=YourSQLServer":使用名為"YourSQLServer"的服務(wù)器.他的別名為"Data Source","Address","Addr".如果使用的是本地?cái)?shù)據(jù)庫(kù)且定義了實(shí)例名,則可以寫(xiě)為"Server=(local)\實(shí)例名";如果是遠(yuǎn)程服務(wù)器,則將"(local)"替換為遠(yuǎn)程服務(wù)器的名稱(chēng)或IP地址.
"Connect Timeout=30":連接超時(shí)時(shí)間為30秒.
注:以上User ID,Password可以大寫(xiě)也可以小寫(xiě),與大小寫(xiě)無(wú)關(guān)
========
用c#讀取并分析sql2005日志
??用過(guò)logExplorer的朋友都會(huì)被他強(qiáng)悍的功能吸引,我寫(xiě)過(guò)一篇詳細(xì)的操作文檔可以參考
http://blog.csdn.net/jinjazz/archive/2008/05/19/2459692.aspx
我們可以自己用開(kāi)發(fā)工具來(lái)實(shí)現(xiàn)sql日志的讀取,這個(gè)應(yīng)用還是很酷的,具體思路
1、首先要了解一個(gè)沒(méi)有公開(kāi)的系統(tǒng)函數(shù)::fn_dblog,他可以讀取sql日志,并返回二進(jìn)制的行數(shù)據(jù)
2、然后要了解sql的二進(jìn)制數(shù)據(jù)是如何存儲(chǔ)的,這個(gè)可以參考我的blog文章
http://blog.csdn.net/jinjazz/archive/2008/08/07/2783872.aspx
3、用自己擅長(zhǎng)的開(kāi)發(fā)工具來(lái)分析數(shù)據(jù),得到我們需要的信息
我用c#寫(xiě)了一個(gè)測(cè)試樣例,分析了int,char,datetime和varchar的日志情況而且沒(méi)有考慮null和空字符串的保存,希望感興趣的朋友能和我一起交流打造屬于自己的日志分析工具
詳細(xì)的試驗(yàn)步驟以及代碼如下:
1、首先建立sqlserver的測(cè)試環(huán)境,我用的sql2005,這個(gè)過(guò)程不能保證在之前的版本中運(yùn)行
以下sql語(yǔ)句會(huì)建立一個(gè)dbLogTest數(shù)據(jù)庫(kù),并建立一張log_test表,然后插入3條數(shù)據(jù)之后把表清空
use master
go
create database dbLogTest
go
use ?dbLogTest
go
create table log_test(id int ,code char(10),name varchar(20),date datetime,memo varchar(100))
insert into log_test select 100, 'id001','jinjazz',getdate(),'剪刀'
insert into log_test select 65549,'id002','游客',getdate()-1,'這家伙很懶,沒(méi)有設(shè)置昵稱(chēng)'
insert into log_test select -999,'id003','這家伙來(lái)自火星',getdate()-1000,'a'
delete from log_test
--use master?
--go
--drop database dbLogTest
2、我們最終的目的是要找到被我們刪掉的數(shù)據(jù)
3、分析日志的c#代碼:我已經(jīng)盡量詳細(xì)的寫(xiě)了注釋
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication21
{
? ? class Program
? ? {
? ? ? ? /// <summary>
? ? ? ? /// 分析sql2005日志,找回被delete的數(shù)據(jù),引用請(qǐng)保留以下信息
? ? ? ? /// 作者:jinjazz (csdn的剪刀)
? ? ? ? /// 作者blog:http://blog.csdn.net/jinjazz
? ? ? ? /// </summary>
? ? ? ? /// <param name="args"></param>
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection())
? ? ? ? ? ? {
? ? ? ? ? ? ? ? conn.ConnectionString = "server=localhost;uid=sa;pwd=sqlgis;database=dbLogTest";
? ? ? ? ? ? ? ? conn.Open();
? ? ? ? ? ? ? ? using (System.Data.SqlClient.SqlCommand command = conn.CreateCommand())
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? //察看dbo.log_test對(duì)象的sql日志
? ? ? ? ? ? ? ? ? ? command.CommandText = @"SELECT allocunitname,operation,[RowLog Contents 0] as r0,[RowLog Contents 1]as r1?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? from::fn_dblog (null, null) ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? where allocunitname like 'dbo.log_test%'and
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? operation in('LOP_INSERT_ROWS','LOP_DELETE_ROWS')";
? ? ? ? ? ? ? ? ? ? System.Data.SqlClient.SqlDataReader reader = command.ExecuteReader();
? ? ? ? ? ? ? ? ? ? //根據(jù)表字段的順序建立字段數(shù)組
? ? ? ? ? ? ? ? ? ? Datacolumn[] columns = new Datacolumn[]
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? new Datacolumn("id", System.Data.SqlDbType.Int),
? ? ? ? ? ? ? ? ? ? ? ? ? ? new Datacolumn("code", System.Data.SqlDbType.Char,10),
? ? ? ? ? ? ? ? ? ? ? ? ? ? new Datacolumn("name", System.Data.SqlDbType.VarChar),
? ? ? ? ? ? ? ? ? ? ? ? ? ? new Datacolumn("date", System.Data.SqlDbType.DateTime),
? ? ? ? ? ? ? ? ? ? ? ? ? ? new Datacolumn("memo", System.Data.SqlDbType.VarChar)
? ? ? ? ? ? ? ? ? ? ? ? };
? ? ? ? ? ? ? ? ? ? //循環(huán)讀取日志
? ? ? ? ? ? ? ? ? ? while (reader.Read())
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? byte[] data = (byte[])reader["r0"];
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //把二進(jìn)制數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為明文
? ? ? ? ? ? ? ? ? ? ? ? ? ? TranslateData(data, columns);
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("數(shù)據(jù)對(duì)象{1}的{0}操作:", reader["operation"], reader["allocunitname"]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach (Datacolumn c in columns)
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("{0} = {1}", c.Name, c.Value);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? catch
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //to-do...
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? reader.Close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? conn.Close();
? ? ? ? ? ? }
? ? ? ? ? ? Console.WriteLine("************************日志分析完成");
? ? ? ? ? ? Console.ReadLine();
? ? ? ? }
? ? ? ? //自定義的column結(jié)構(gòu)
? ? ? ? public class Datacolumn
? ? ? ? {
? ? ? ? ? ? public string Name;
? ? ? ? ? ? public System.Data.SqlDbType DataType;
? ? ? ? ? ? public short Length = -1;
? ? ? ? ? ? public object Value = null;
? ? ? ? ? ? public Datacolumn(string name, System.Data.SqlDbType type)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Name = name;
? ? ? ? ? ? ? ? DataType = type;
? ? ? ? ? ? }
? ? ? ? ? ? public Datacolumn(string name,System.Data.SqlDbType type,short length)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Name = name;
? ? ? ? ? ? ? ? DataType = type;
? ? ? ? ? ? ? ? Length = length;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// sql二進(jìn)制結(jié)構(gòu)翻譯,這個(gè)比較關(guān)鍵,測(cè)試環(huán)境為sql2005,其他版本沒(méi)有測(cè)過(guò)。
? ? ? ? /// </summary>
? ? ? ? /// <param name="data"></param>
? ? ? ? /// <param name="columns"></param>
? ? ? ? static void TranslateData(byte[] data, Datacolumn[] columns)
? ? ? ? {
? ? ? ? ? ? //我只根據(jù)示例寫(xiě)了Char,DateTime,Int三種定長(zhǎng)度字段和varchar一種不定長(zhǎng)字段,其余的有興趣可以自己補(bǔ)充
? ? ? ? ? ? //這里沒(méi)有暫時(shí)沒(méi)有考慮Null和空字符串兩種情況,以后會(huì)補(bǔ)充。
? ? ? ? ? ? //引用請(qǐng)保留以下信息:
? ? ? ? ? ? //作者:jinjazz?
? ? ? ? ? ? //sql的數(shù)據(jù)行二進(jìn)制結(jié)構(gòu)參考我的blog
? ? ? ? ? ? //http://blog.csdn.net/jinjazz/archive/2008/08/07/2783872.aspx
? ? ? ? ? ? //行數(shù)據(jù)從第5個(gè)字節(jié)開(kāi)始
? ? ? ? ? ? short index = 4;
? ? ? ? ? ? //先取定長(zhǎng)字段
? ? ? ? ? ? foreach (Datacolumn c in columns)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? switch (c.DataType)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? case System.Data.SqlDbType.Char:
? ? ? ? ? ? ? ? ? ? ? ? //讀取定長(zhǎng)字符串,需要根據(jù)表結(jié)構(gòu)指定長(zhǎng)度
? ? ? ? ? ? ? ? ? ? ? ? c.Value = System.Text.Encoding.Default.GetString(data,index,c.Length);
? ? ? ? ? ? ? ? ? ? ? ? index += c.Length;
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case System.Data.SqlDbType.DateTime:
? ? ? ? ? ? ? ? ? ? ? ? //讀取datetime字段,sql為8字節(jié)保存
? ? ? ? ? ? ? ? ? ? ? ? System.DateTime date = new DateTime(1900, 1, 1);
? ? ? ? ? ? ? ? ? ? ? ? //前四位1/300秒保存
? ? ? ? ? ? ? ? ? ? ? ? int second = BitConverter.ToInt32(data, index);
? ? ? ? ? ? ? ? ? ? ? ? date = date.AddSeconds(second/300);
? ? ? ? ? ? ? ? ? ? ? ? index += 4;
? ? ? ? ? ? ? ? ? ? ? ? //后四位1900-1-1的天數(shù)
? ? ? ? ? ? ? ? ? ? ? ? int days = BitConverter.ToInt32(data, index);
? ? ? ? ? ? ? ? ? ? ? ? date=date.AddDays(days);
? ? ? ? ? ? ? ? ? ? ? ? index += 4;
? ? ? ? ? ? ? ? ? ? ? ? c.Value = date;
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case System.Data.SqlDbType.Int:
? ? ? ? ? ? ? ? ? ? ? ? //讀取int字段,為4個(gè)字節(jié)保存
? ? ? ? ? ? ? ? ? ? ? ? c.Value = BitConverter.ToInt32(data, index);
? ? ? ? ? ? ? ? ? ? ? ? index += 4;
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ?default:
? ? ? ? ? ? ? ? ? ? ? ?//忽略不定長(zhǎng)字段和其他不支持以及不愿意考慮的字段
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? //跳過(guò)三個(gè)字節(jié)
? ? ? ? ? ? index += 3;
? ? ? ? ? ? //取變長(zhǎng)字段的數(shù)量,保存兩個(gè)字節(jié)
? ? ? ? ? ? short varColumnCount = BitConverter.ToInt16(data, index);
? ? ? ? ? ? index += 2;
? ? ? ? ? ? //接下來(lái),每?jī)蓚€(gè)字節(jié)保存一個(gè)變長(zhǎng)字段的結(jié)束位置,
? ? ? ? ? ? //所以第一個(gè)變長(zhǎng)字段的開(kāi)始位置可以算出來(lái)
? ? ? ? ? ? short startIndex =(short)( index + varColumnCount * 2);
? ? ? ? ? ? //第一個(gè)變長(zhǎng)字段的結(jié)束位置也可以算出來(lái)
? ? ? ? ? ? short endIndex = BitConverter.ToInt16(data, index);
? ? ? ? ? ? //循環(huán)變長(zhǎng)字段列表讀取數(shù)據(jù)
? ? ? ? ? ? foreach (Datacolumn c in columns)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? switch (c.DataType)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? case System.Data.SqlDbType.VarChar:
? ? ? ? ? ? ? ? ? ? ? ? //根據(jù)開(kāi)始和結(jié)束位置,可以算出來(lái)每個(gè)變長(zhǎng)字段的值
? ? ? ? ? ? ? ? ? ? ? ? c.Value =System.Text.Encoding.Default.GetString(data, startIndex, endIndex - startIndex);
? ? ? ? ? ? ? ? ? ? ? ? //下一個(gè)變長(zhǎng)字段的開(kāi)始位置
? ? ? ? ? ? ? ? ? ? ? ? startIndex = endIndex;
? ? ? ? ? ? ? ? ? ? ? ? //獲取下一個(gè)變長(zhǎng)字段的結(jié)束位置
? ? ? ? ? ? ? ? ? ? ? ? index += 2;
? ? ? ? ? ? ? ? ? ? ? ? endIndex = BitConverter.ToInt16(data, index);
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? ? ? //忽略定長(zhǎng)字段和其他不支持以及不愿意考慮的字段
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? //獲取完畢
? ? ? ? }
? ? }
}
4、更改你的sql連接字符串后運(yùn)行以上代碼,會(huì)看到如下輸出信息:
數(shù)據(jù)對(duì)象dbo.log_test的LOP_INSERT_ROWS操作:
id = 100
code = id001
name = jinjazz
date = 2008-8-7 18:14:03
memo = 剪刀
數(shù)據(jù)對(duì)象dbo.log_test的LOP_INSERT_ROWS操作:
id = 65549
code = id002
name = 游客
date = 2008-8-6 18:14:03
memo = 這家伙很懶,沒(méi)有設(shè)置昵稱(chēng)
數(shù)據(jù)對(duì)象dbo.log_test的LOP_INSERT_ROWS操作:
id = -999
code = id003
name = 這家伙來(lái)自火星
date = 2005-11-11 18:14:03
memo = a
數(shù)據(jù)對(duì)象dbo.log_test的LOP_DELETE_ROWS操作:
id = 100
code = id001
name = jinjazz
date = 2008-8-7 18:14:03
memo = 剪刀
數(shù)據(jù)對(duì)象dbo.log_test的LOP_DELETE_ROWS操作:
id = 65549
code = id002
name = 游客
date = 2008-8-6 18:14:03
memo = 這家伙很懶,沒(méi)有設(shè)置昵稱(chēng)
數(shù)據(jù)對(duì)象dbo.log_test的LOP_DELETE_ROWS操作:
id = -999
code = id003
name = 這家伙來(lái)自火星
date = 2005-11-11 18:14:03
memo = a
************************日志分析完成
試驗(yàn)成功~~
dbcc log和fn_dblog函數(shù)真的是分析日志文件嗎??
這個(gè)問(wèn)題需要了解CheckPoint和sql的存儲(chǔ)機(jī)制,首先參考如下文檔?
http://msdn.microsoft.com/zh-cn/library/ms188748.aspx?
CheckPoint?
將當(dāng)前數(shù)據(jù)庫(kù)的全部臟頁(yè)寫(xiě)入磁盤(pán)。“臟頁(yè)”是已輸入緩存區(qū)高速緩存且已修改但尚未寫(xiě)入磁盤(pán)的數(shù)據(jù)頁(yè)。CHECKPOINT 可創(chuàng)建一個(gè)檢查點(diǎn),在該點(diǎn)保證全部臟頁(yè)都已寫(xiě)入磁盤(pán),從而在以后的恢復(fù)過(guò)程中節(jié)省時(shí)間。?
什么時(shí)候執(zhí)行它?大致有幾種情況:?
手動(dòng)調(diào)用、sql自動(dòng)定時(shí)執(zhí)行、數(shù)據(jù)庫(kù)脫機(jī)之類(lèi)操作、數(shù)據(jù)庫(kù)進(jìn)程正常終止等情況。?
簡(jiǎn)單日志模型的原理就是每次checkpoint后自動(dòng)截?cái)嗳罩尽?
dbcc log到底有什么用?和checkpoint有什么關(guān)系?
在事物外執(zhí)行過(guò)CheckPoint后,dbcc log語(yǔ)句將無(wú)法獲取之前的日志。所以我推斷此語(yǔ)句是系統(tǒng)為了在非正常關(guān)閉數(shù)據(jù)庫(kù)的狀態(tài)下,來(lái)保證日志,內(nèi)存中的臟頁(yè)和數(shù)據(jù)文件的一致性的措施,此方法并不是讀取日志文件的全部信息。?
log explorer的原理?
還沒(méi)有搞清楚,此前的推斷是錯(cuò)誤的,它不是通過(guò)dbcc log 或者fn_dblog方法實(shí)現(xiàn)的,不但CheckPoint對(duì)它沒(méi)有影響,而且他會(huì)主動(dòng)調(diào)用這個(gè)語(yǔ)句。
日志分析工具宣告流產(chǎn),不過(guò)基本上搞清了日志和數(shù)據(jù)文件的存儲(chǔ)結(jié)構(gòu),希望以后仍然可以用的上這些經(jīng)驗(yàn)
========
解析c#得到局域網(wǎng)內(nèi)所有sqlserver數(shù)據(jù)庫(kù)實(shí)例
官方的做法是這樣的:
using System.Data.Sql; ?
?
class Program ?
{ ?
? static void Main() ?
? { ?
? ? // Retrieve the enumerator instance and then the data. ?
? ? SqlDataSourceEnumerator instance = ?
? ? ? SqlDataSourceEnumerator.Instance; ?
? ? System.Data.DataTable table = instance.GetDataSources(); ?
?
? ? // Display the contents of the table. ?
? ? DisplayData(table); ?
?
? ? Console.WriteLine("Press any key to continue."); ?
? ? Console.ReadKey(); ?
? } ?
?
? private static void DisplayData(System.Data.DataTable table) ?
? { ?
? ? foreach (System.Data.DataRow row in table.Rows) ?
? ? { ?
? ? ? foreach (System.Data.DataColumn col in table.Columns) ?
? ? ? { ?
? ? ? ? Console.WriteLine("{0} = {1}", col.ColumnName, row[col]); ?
? ? ? } ?
? ? ? Console.WriteLine("============================"); ?
? ? } ?
? } ?
}?
來(lái)源于:http://msdn.microsoft.com/en-us/library/system.data.sql.sqldatasourceenumerator.getdatasources.aspx
請(qǐng)看遇到的問(wèn)題及解決方法:
?
實(shí)際上問(wèn)題就是,得到的結(jié)果只有服務(wù)器名字,但由于是默認(rèn)實(shí)例,所以并沒(méi)有實(shí)例名字。而且,假如安裝的是sqlserver,則連接數(shù)據(jù)庫(kù)是必須是 服務(wù)器\sqlexpress(默認(rèn)實(shí)例名稱(chēng));假如安裝的是完整版的sqlexpress,則只需 服務(wù)器 即可連接。這就造成了不少問(wèn)題。 上邊百度給出比較好的解決方法。
?
本文出自 “獨(dú)釣寒江雪” 博客,請(qǐng)務(wù)必保留此出處http://zhaojie.blog.51cto.com/1768828/932275
========
C#數(shù)據(jù)庫(kù)查詢(xún)和操作大全
一:C#數(shù)據(jù)庫(kù)查詢(xún)之?dāng)?shù)據(jù)庫(kù)連接代碼:SqlConnectionobjSqlConnection=newSqlConnection("server=127.0.0.1;uid=sa;pwd=;database=test"); ?
objSqlConnection.Open();?
二:數(shù)據(jù)庫(kù)的添加記錄代碼:
inti=0; ?
strings1="",s2=""; ?
i=Convert.ToInt16(textBox1.Text); ?
s1=textBox2.Text; ?
s2=textBox3.Text; ?
?
SqlConnectionobjSqlConnection=newSqlConnection("server=127.0.0.1;uid=sa;pwd=;database=test"); ?
objSqlConnection.Open(); ?
?
MessageBox.Show("數(shù)據(jù)庫(kù)連接成功","好"); ?
?
try ?
{ ?
SqlCommandsqlcom=newSqlCommand("insertintoinfo(id,name,sex)values("+i+",'"+s1+"','"+s2+"')",objSqlConnection); ?
sqlcom.ExecuteNonQuery(); ?
MessageBox.Show("添加成功!","啊"); ?
} ?
catch(Exceptiona) ?
{ ?
MessageBox.Show(a.ToString()); ?
} ?
MessageBox.Show("添加成功!","啊"); ?
}?
三:數(shù)據(jù)庫(kù)的修改代碼:
inti=0; ?
strings1="",s2=""; ?
s1=textBox2.Text; ?
s2=textBox3.Text; ?
if(textBox1.Text.Length==0) ?
i=0; ?
else?
i=Convert.ToInt32(textBox1.Text); ?
?
SqlConnectionobjSqlConnection=newSqlConnection("server=127.0.0.1;uid=sa;pwd=;database=test"); ?
objSqlConnection.Open(); ?
MessageBox.Show("數(shù)據(jù)庫(kù)連接成功","好"); ?
try ?
{ ?
SqlCommandsqlcom=newSqlCommand("updateinfosetname='"+s1+"',sex='"+s2+"'"+"whereid="+i,objSqlConnection); ?
sqlcom.ExecuteNonQuery(); ?
MessageBox.Show("修改成功!","啊"); ?
objSqlConnection.Close(); ?
} ?
catch(Exceptiona) ?
{ ?
MessageBox.Show(a.ToString()); ?
}?
四:數(shù)據(jù)庫(kù)的刪除代碼:
inti=0; ?
strings1="",s2=""; ?
s1=textBox2.Text; ?
s2=textBox3.Text; ?
if(textBox1.Text.Length==0) ?
i=0; ?
else?
i=Convert.ToInt16(textBox1.Text); ?
SqlConnectionobjSqlConnection=newSqlConnection("server=127.0.0.1;uid=sa;pwd=;database=test"); ?
objSqlConnection.Open(); ?
MessageBox.Show("數(shù)據(jù)庫(kù)連接成功","好"); ?
try?
{ ?
SqlCommandsqlcom=newSqlCommand("deletefrominfowhereid="+i,objSqlConnection); ?
?
sqlcom.ExecuteNonQuery(); ?
?
MessageBox.Show("刪除成功!","啊"); ?
?
objSqlConnection.Close(); ?
} ?
catch(Exceptiona) ?
{ ?
MessageBox.Show(a.ToString()); ?
}?
五:數(shù)據(jù)庫(kù)的查詢(xún)代碼:
1.類(lèi)開(kāi)始:
DataTabledt1=newDataTable(); ?
SqlDataAdapterda1=newSqlDataAdapter();?
2.按鈕代碼:
inti=0,n=0; ?
strings1="",s2=""; ?
s1=textBox2.Text; ?
s2=textBox3.Text; ?
if(textBox1.Text.Length==0) ?
i=0; ?
else?
i=Convert.ToInt32(textBox1.Text); ?
SqlConnectionobjSqlConnection=newSqlConnection("server=127.0.0.1;uid=sa;pwd=;database=test"); ?
objSqlConnection.Open(); ?
MessageBox.Show("數(shù)據(jù)庫(kù)連接成功","好"); ?
?
stringquery="SELECT*frominfowhereid="+i; ?
?
DataSetobjDataSet=newDataSet(); ?
?
SqlDataAdapterobj=newSqlDataAdapter(); ?
?
obj.SelectCommand=newSqlCommand(query,objSqlConnection); ?
?
obj.Fill(objDataSet,"info"); ?
?
SqlCommandobjSqlCommand=newSqlCommand(query,objSqlConnection); ?
?
SqlDataReaderobjSqlReader=objSqlCommand.ExecuteReader(); ?
?
while(objSqlReader.Read()) ?
{ ?
n+=1; ?
MessageBox.Show("編號(hào):"+objSqlReader.Getvalue(0)+"姓名:"+objSqlReader.Getvalue(1)+"性別"+objSqlReader.Getvalue(2)); ?
} ?
if(n==0) ?
MessageBox.Show("數(shù)據(jù)庫(kù)中沒(méi)有這樣的記錄!");?
六:C#數(shù)據(jù)庫(kù)查詢(xún)代碼:
inti=0; ?
//intn=0; ?
strings1="",s2=""; ?
stringsql; ?
s1=textBox2.Text; ?
s2=textBox3.Text; ?
?
if(textBox1.Text.Length==0) ?
{ ?
i=0; ??
} ?
else?
i=Convert.ToInt32(textBox1.Text); ?
SqlConnectionobjSqlConnection=newSqlConnection("server=127.0.0.1;uid=sa;pwd=;database=test"); ?
objSqlConnection.Open(); ?
MessageBox.Show("數(shù)據(jù)庫(kù)連接成功","好"); ?
stringquery="SELECT*frominfowhereid="+i; ?
if(i==0) ?
sql="select*frominfo"; ?
else?
sql="select*frominfowhereid="+i; ?
da1=newSqlDataAdapter(sql,objSqlConnection); ?
dt1.Clear(); ?
da1.Fill(dt1); ?
dataGridView1.DataSource=dt1;?
C#數(shù)據(jù)庫(kù)查詢(xún)之?dāng)?shù)據(jù)庫(kù)的封裝類(lèi)代碼:
classDBClass ?
{ ??
publicvoiddbclass(stringsql) ?
{ ?
try?
{ ?
SqlConnectionsqlcon=newSqlConnection("server=127.0.0.1;uid=sa;pwd=;database=test"); ?
sqlcon.Open(); ?
?
SqlTransactionobjt=sqlcon.BeginTransaction();//事物開(kāi)始 ?
?SqlCommandsqlcom=newSqlCommand(sql,sqlcon); ?
?sqlcom.Transaction=objt;//將Command對(duì)象設(shè)置為事物處理的對(duì)象 ?
?sqlcom.ExecuteNonQuery(); ?
objt.Commit();//提交事物 ?
sqlcon.Close(); ?
} ?
catch(Exceptiona) ?
{ ?
MessageBox.Show(a.ToString()); ?
} ?
} ?
} ?
--db2數(shù)據(jù)庫(kù)連接代碼: ?
stringstrcon="Provider=IBMDADB2;DataSource=hfzd;UserId=db2admin;Password=db2admin"; ?
//stringsql="select*fromADMINISTRATOR.HFZD"; ?
stringsql="deletefromADMINISTRATOR.HFZDwhereID=1"; ?
OleDbConnectionolecon=newOleDbConnection(strcon); ?
olecon.Open(); ?
MessageBox.Show("數(shù)據(jù)庫(kù)已連接上"); ?
dt.Clear(); ?
da=newOleDbDataAdapter(sql,olecon); ?
da.Fill(dt); ?
dataGridView1.DataSource=dt; ?
olecon.Close();
========
C#與SQL常用操作
ADO.NET中對(duì)數(shù)據(jù)庫(kù)的操作是:斷開(kāi)式連接,只需要寫(xiě)一次連接服務(wù)器,庫(kù)名,用戶(hù)名,密碼的字符串,以后只對(duì)con 進(jìn)行close()和con.Open() 操作即可連接數(shù)據(jù)庫(kù)
? ? ? ?先從數(shù)據(jù)庫(kù)中取出結(jié)果集后進(jìn)行處理數(shù)據(jù)后再UpData更新到數(shù)據(jù)庫(kù)(共三步)
? ? ? ?如果只想讀取和顯示數(shù)據(jù) 則只需使用數(shù)據(jù)讀取器 SqlDataReader即可, 但要處理數(shù)據(jù)然后更新數(shù)據(jù)庫(kù)(增加,更改),就需要用數(shù)據(jù)集DataSet和
? ? ? ?數(shù)據(jù)適配器SqlDataAdaper
?
SqlDataAdapter在下面有用法:
?
其中:讀取數(shù)據(jù)時(shí)用SqlDataReader是固定的 但是處理數(shù)據(jù)更新時(shí)(增加,更改)為兩種情況,(一)直接拼SQL語(yǔ)句 適用于簡(jiǎn)單的表,
? ? ? ?(二)用參數(shù)的 用到SqlDataAdaper 適用于復(fù)雜的表
? ? ? 建議:簡(jiǎn)單的表可以用(一) 但是在實(shí)際項(xiàng)目中復(fù)雜的表最好用(二)
? ? ? ? ? ?因?yàn)閹?shù)的 要插入或更改的數(shù)據(jù)結(jié)構(gòu)已被參數(shù)欲留位置了,不用對(duì)其進(jìn)行類(lèi)型轉(zhuǎn)換,當(dāng)在后面定義了參數(shù)后會(huì)自動(dòng)轉(zhuǎn)換,比較簡(jiǎn)單
? ? ? ? ? ?其中刪除一條記錄不用帶參數(shù)的直接用(一)拼SQL語(yǔ)句 cmd.ExecuteNonQuery()即可
? ? ? ? ? ?只有insert 和 update 增加和更改用帶參數(shù)的 如果全部刪除也的用帶參數(shù)的
?
? ?補(bǔ)充(必看):定義個(gè)全局變量 Private SqlConnectionm_con =null;
? ? ? ? 然后在方法內(nèi)部 m_con=new 出來(lái)
? ? ? ? 斷開(kāi)式連接體現(xiàn)在:寫(xiě)一個(gè) 連接數(shù)據(jù)庫(kù)的方法 返回bool值 以后再就不用寫(xiě)連服務(wù)器,庫(kù)名,用戶(hù)名,密碼的字符串了
? ? ? ? 以后再連接數(shù)據(jù)庫(kù)就直接用m_con.Open();即可打開(kāi)
? ? ? ? ? ? ? public ?bool db_check()//當(dāng)然復(fù)雜時(shí)就用傳參數(shù)形式
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?boolflag=false;
? ? ? ? ? ? ? ? ? ? ?stringConnectionString ="data source =" + dbServerName.Text +";initialcatalog=" + dbName.Text + ";
? ? ? ? ? ? ? ? ? ? ?userid=" +dbUsername.Text + ";password=" +this.dbPassword.Text +";";
? ? ? ? ? ? ? ? ? ? ?try
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? m_con= new SqlConnection(ConnectionString);
? ? ? ? ? ? ? ? ? ? ? ? ? ? m_con.Open();
? ? ? ? ? ? ? ? ? ? ? ? ? ? MessageBox.Show("數(shù)據(jù)庫(kù)連接成功!");
? ? ? ? ? ? ? ? ? ? ? ? ? ? flag=true;
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?catch
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? MessageBox.Show("數(shù)據(jù)庫(kù)連接不成功!");
? ? ? ? ? ? ? ? ? ? ? ? ? ? flag=false;
? ? ? ? ? ? ? ? ? ? ?} ? ?
? ? ? ? ? ? ? ? ? ? ?returnflag;
? ? ? ? ? ? ? }
?
(一)、c#連接SQL數(shù)據(jù)庫(kù)代碼:==只是一個(gè)簡(jiǎn)單的例子
? ? ? ?publicDataTable Read()
? ? ? ?{
? ? ? ?DataTabledt =new DataTable();//新建表
? ? ? ?dt.Columns.Add("col_1");//新建表中的列
? ? ? ?dt.Columns.Add("col_2");
? ? ? ?stringConnectionString ="data source=localhost;initial catalog=pubs;userid=sa;password=sa";
? ? ? ?SqlConnection Conn=new SqlConnection(ConnectionString);
? ? ? ?if(Conn.State==ConnectionState.Open)
? ? ? ?{
? ? ? ?Conn.Close();
? ? ? ?}
? ? ? ?Conn.ConnectionString=ConnectionString;
? ? ? ?Conn.Open();
? ? ? ?try
? ? ? ?{
? ? ? ?SqlCommandcmd=new SqlCommand("Select * from tab_name",Conn);
? ? ? ?SqlDataReadermyReader =cmd.ExecuteReader();//執(zhí)行SQL語(yǔ)句的真正查詢(xún)了
? ? ? ?inta=0;
? ? ? ?intb=0;//用來(lái)接收已經(jīng)查詢(xún)出來(lái)的字段
? ? ? ?while(myReader.Read()) 每次循環(huán)查到的一行 如果有N行就循環(huán)N次而已
? ? ? {
? ? ? ?DataRowdr =dt.NewRow();//每循環(huán)一次新建一行
? ? ? ?dr[0]=myReader.GetInt32(0).ToString(); ? ?表示接收第一個(gè)字段(string型)
? ? ? ?dr[1] =myReader.GetInt32(1).ToString(); ? ? ? ? ?
? ? ? ?dt.Rows.Add(dr);//每次循環(huán)把dr加進(jìn)去
? ? ? ?}
? ? ? ?myReader.Close();
? ? ? ?Conn.Close();
? ? ? ?}
? ? ? ?catch(Exceptionex)
? ? ? ?{
? ? ? MessageBox.Show(ex.Message.ToString());
? ? ? ?}
? ? ? ?returndt;
? ? ? ?}?
?
?(二)、 關(guān)于Command對(duì)象 (SqlCommand有兩種方法各有優(yōu)點(diǎn))
? ? ? //只用于查詢(xún)其實(shí)可以用于多記錄查詢(xún) 兩個(gè)SQL語(yǔ)句連起來(lái) 用 myReader.NextResult() 即可
? ? ? ?(A)SqlCommand cmd =new SqlCommand(SqlText,con);//這是讀數(shù)據(jù) 此要和 SqlDataReader連用 再和ExecuteReader或ExecuteScalar連用.
? ? ? ? ? ?new 這個(gè)是用來(lái)讀數(shù)據(jù)的 就用DataReader 來(lái)接
? ? ? ?這句等同于下面的三句
? ? ? ?(B)
? ? ? //這個(gè)不用于查詢(xún)用于執(zhí)行T_SQL增刪改等等
? ? ? ?SqlCommandcmd =con.CreateCommand();
? ? ? ?cmd.CommandTest="Createtable tab_name (name varchar(20),password varchar(20))";
? ? ? ?cmd.ExecuteNonQuery();
? ? ? ?***說(shuō)明 :關(guān)于SqlCommand用法有ExecuteNonQuery、ExecuteReader,ExecuteScalar三種其中ExecuteReader(所有查詢(xún)),ExecuteScalar(首行首列查詢(xún))
? ? ? ? ?ExecuteNonQuery為執(zhí)行T-SQL語(yǔ)句但是不建議查詢(xún)
? ? ? ? ?如果一個(gè)類(lèi)有多個(gè)SQL語(yǔ)句要執(zhí)行用(B)ExecuteNonQuery三句 但是ExecuteNonQuery自動(dòng)執(zhí)行最靠近它的那句CommandTest(每次只執(zhí)行一句)
? ? ? ? ?如果一個(gè)類(lèi)中只有一個(gè)SQL語(yǔ)句要執(zhí)行用(A)即可
? ? ? ?***說(shuō)明: (A)A與ExecuteReader,ExecuteScalar相匹配
? ? ? ? ?(B)B三句的與ExecuteNonQuery相匹配?
?
?(三)、關(guān)于數(shù)據(jù)讀取器 SqlDataReader 對(duì)象 (其中SqlDataReader是和SqlCommand cmd =new SqlCommand(SqlText,con)它連用的)
? ? ? ? 如果只想讀取和顯示數(shù)據(jù) 則只需使用數(shù)據(jù)讀取器 SqlDataReader即可 但要處理數(shù)據(jù)然后更新數(shù)據(jù)庫(kù),就需要用數(shù)據(jù)集DataSet和適配器 SqlDataAdaper
? ? ? ? SqlDataReader reader =new SqlDataReader();
? ? ? ? (A)實(shí)例:
? ? ? ?SqlCommandcmd=new SqlCommand("Select * from tab_name",Conn);
? ? ? ?SqlDataReadermyReader =cmd.ExecuteReader();//執(zhí)行SQL語(yǔ)句的真正查詢(xún)了
? ? ? ?while(myReader.Read()) 每次循環(huán)查到的一行 如果有N行就循環(huán)N次而已
? ? ? {
? ? ? ?DataRowdr =dt.NewRow();//每循環(huán)一次新建一行
? ? ? ?dr[0]=myReader.GetInt32(0).ToString(); ? ?表示接收第一個(gè)字段(string型)
? ? ? ?dr[1] =myReader.GetInt32(1).ToString(); ? ? ? ? ?
? ? ? ?dt.Rows.Add(dr);//每次循環(huán)把dr加進(jìn)去
? ? ? ?(B):GetSchemaTable方法 返回一個(gè)已填充的DataTable實(shí)例 (可以一次讀出完整表的內(nèi)容)
? ? ? ? ? ? ? DataTableschema =reader.GetSchemaTable();
? ? ? ? ? ? ? 用它可以把數(shù)據(jù)庫(kù)中查詢(xún)出的結(jié)果集以表的形式得到完整的傳給schema表
? ? ? ? ? ? ? ? 就可以通過(guò)DataTable的Rows屬性檢索行集,通過(guò)DataTable的Columns屬性檢索列集(Rows屬性可用于給表添加新行或者從表中刪除行,
? ? ? ? ? ? ? ? Columns屬性可用于添加列或者刪除現(xiàn)有的列)
? ? ? ? 實(shí)例:
? ? ? ? ? ? ? DataTableschema =reader.GetSchemaTable();//查詢(xún)出的結(jié)果集以表的形式得到完整的傳給schema表
? ? ? ? ? ? ? ? ?foreach(DataRow row in schema.Rows)//這時(shí)相當(dāng)于對(duì)schema表進(jìn)行操作了
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? foreach(DataColumn col in schema.Columns)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?Console.WriteLine(col.ColumnName+ "=" + row[col]);
? ? ? ? ? ? ? ? ? ? ?Console.WriteLine("==========");
? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? }
?
? ? ? ?(C):reader.NextResult() ?使用數(shù)據(jù)讀取器處理多個(gè)結(jié)果集
? ? ? ? ? ?string sql_1=@"select * from tab_1";
? ? ? ? ? ?string sql_2=@" select * fromtab_2";//這里一定要有個(gè)空格才可以 因?yàn)楫?dāng)兩個(gè)SQL語(yǔ)句連接時(shí)要用空格分開(kāi)
? ? ? ? ? ?string sql =sql_1 + sql_2;
? ? ? ? ? ?SqlCommand cmd =new SqlCommand(sql,con);//執(zhí)行兩個(gè)或多個(gè)SQL語(yǔ)句的聯(lián)合查詢(xún)
? ? ? ? ? ?SqlDataReader reader=cmd.ExecuteReader();//這時(shí)有多個(gè)結(jié)果集
? ? ? ? ? ?do
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ?while(reader.Read())//讀取一個(gè)結(jié)果集的所有內(nèi)容
? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ?Console.WriteLine("{0}:{1}",reader[0],reader[1]);
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?Console.WriteLine("".PadLeft(60,'='));
? ? ? ? ? ? ? }
? ? ? ? ?while(reader.NextResult());//循環(huán)讀下個(gè)結(jié)果集
?
? ? ? ?***補(bǔ)充:如果想判斷當(dāng)SqlDataReader沒(méi)有讀出結(jié)果時(shí)要做的處理方法:
? ? ? ? ? ? ? ? 首先要走
? ? ? ? ? ? ? ? ? ? ?while(reader.Read())//讀取一個(gè)結(jié)果集的所有內(nèi)容
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("{0}:{1}",reader[0],reader[1]);
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ?中的reader.Read();//必須要走這一步
? ? ? ? ? ? ? ? ? ? ? ? ?如果想判斷當(dāng)沒(méi)有讀出結(jié)果時(shí) 就必須在While(reader.Read())之后
? ? ? ? ? ? ? ? ? ? ?if(reader.HasRows==false)//判斷如果沒(méi)有讀出結(jié)果
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MessageBox.Show("要查詢(xún)的結(jié)果不存在!");
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ?這是沒(méi)有讀出結(jié)果時(shí) 如果讀出結(jié)果了 那就直接走while(reader.Read()){}里面了就不走if(){}里面了
?
? ? ? ? ? ? ? ? ? ? ?其實(shí)如果用到了DataTable 也可以用if(dt.Rows.count<0){}也可以的
?
[SqlDataAdapter]
? ?(四)、SqlDataAdapter
? ? ? ? ? ? ? 數(shù)據(jù)集和數(shù)據(jù)適配器 ?DataSet 和 SqlDataAdapter
? ? ? ? ? 知識(shí)點(diǎn):
? ? ? ? ? ?SqlDataAdapter da =new SqlDataAdapter();
? ? ? ? ? ? ? ? ? (1)da.Fill();
? ? ? ? ? ? ? (2)da.SelectComand=newSqlCommand(sqlText,con);
? ? ? ? ? ? ? (3)DataTabledt=new DataTable();
? ? ? ? ? ? ? ? ? ?dt.Select(where條件,升降序);
? ? ? ? ? ? ? (4)
? ? ? ? ? ? ? 填充數(shù)據(jù)集有兩種方法:
? ? ? ? ? ? ? ?:使用數(shù)據(jù)適配器
? ? ? ? ? ? ? ? ? ? ?:從XML文檔中讀取數(shù)據(jù)
? ? ? ? ?4.1)
? ? ? ? ?SqlDataAdapter da =new SqlDataAdapter();
? ? ? ?da.SelectCommand =new SqlCommand(sqlText,con);
? ? ? ? ?DataSet ds =new DataSet();
? ? ? ? ?da.Fill(ds,"tab_name");//Fill方法內(nèi)部使用數(shù)據(jù)讀取器訪問(wèn)表模式和數(shù)據(jù),然后使用他們填充數(shù)據(jù)集
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//相當(dāng)于執(zhí)行SQL語(yǔ)句后把結(jié)果集取出后賦給DataSet中的tab_name表。
? ? ? ? ?4.2)
? ? ? ? ?數(shù)據(jù)集的篩選和排序:例子
? ? ? ? ? ? ? staticvoid Main(string [] args)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?stringConnectionString =@"data source=localhost;initial catalog=northwind;userid =sa;password=sa;";
? ? ? ? ? ? ? ? ? ? ?stringsql_1=@"select * from customers";
? ? ? ? ? ? ? ? ? ? ?stringsql_2=@" select * from products where unitprice <10";//注意當(dāng)?shù)诙溥B接時(shí)要有個(gè)空格
? ? ? ? ? ? ? ? ? ? ?stringsql = sql_1+sql_2;//兩條SQL語(yǔ)句拼接
? ? ? ? ? ? ? ? ? ? ?SqlConnectioncon =new SqlConnection(ConnectionString);
? ? ? ? ? ? ? ? ? ? ?if(con.State==ConnectionState.Open)
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? con.Close();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?try
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? con.Open();
? ? ? ? ? ? ? ? ? ? ? ? ? ? SqlDataAdapterda=new SqlDataAdapter();//A
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.SelectCommand=newSqlCommand(sql,con);//B
? ? ? ? ? ? ? ? ? ? ? ? ? ? //其中A和B兩句合并相當(dāng)于:SqlDataAdapterda=new SqlDataAdapter(sql,con);這一句
? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataSetds=new DataSet();
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.Fill(ds,"customers");
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataTableCollectiondtc =ds.Tables;//通過(guò)這句把DataSet中的所有表都給了Table表集合
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("Resultsfrm Customers table:");
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("CompanyName".PadRight(20)+ "ContactName".PadLeft(23) + "\n");
? ? ? ? ? ? ? ? ? ? ? ? ? ? //以下兩句是篩選條件
? ? ? ? ? ? ? ? ? ? ? ? ? ? stringfl ="country='Germany'";//where 條件
? ? ? ? ? ? ? ? ? ? ? ? ? ? stringsrt ="companyname asc"; //降序
? ? ? ? ? ? ? ? ? ? ? ? ? ? //下面是知識(shí)點(diǎn) 數(shù)據(jù)集的篩選條件
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach(DataRowrow in dtc["customers"].Select(fl,srt))//這是用法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//dtc["customers"]說(shuō)明:dtc表集合中的customers表 .Select() 就是篩選條件
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Console.WriteLine("{0}\t{1}",row["CompanyName"].ToString().PadRight(25),row["ContactName"]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("\n----------------------------");
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("Resultsform Products table:");
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("ProductName".PadRight(20)+ "UnitPrice".PadLeft(21) + "\n");
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach(DataRowrow in dtc[1].Rows)
? ? ? ? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Console.WriteLine("{0}\t{1}",row["productname"].ToString().PadRight(25),row["unitprice"]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.ReadLine();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?catch(Exceptionex)
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("Error:"+ex);
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.ReadLine();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?finally
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? con.Close();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? }
?
? ? ? ? ? 4.3)
? ? ? ? ? 使用DataView ?其實(shí)DataView 的功能4.2)數(shù)據(jù)集都可以實(shí)現(xiàn) 所以一般不常用
? ? ? ? ? ? ? DatView是DataTable內(nèi)容的動(dòng)態(tài)表示,與SQL視圖一樣,他不保存數(shù)據(jù)
? ? ? ? ? ? ? 下面一句就是把dt表中的記錄有賦給了DataView dv 然后對(duì)dv進(jìn)行操作 DataView有自己的動(dòng)態(tài)方法
? ? ? ? ? ? ? DataViewdv =new DataView(dt,"country='Germany'","country",DataViewRowState.CurrentRows);
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? 例子:
? ? ? ? ? ? ? static void Main(string[]args)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?stringConnectionString =@"data source =localhost;initial catalog =northwind;userid =sa;password=sa;";
? ? ? ? ? ? ? ? ? ? ?stringsqlText=@"select contactname,country from customers";
? ? ? ? ? ? ? ? ? ? ?SqlConnectioncon =new SqlConnection(ConnectionString);
? ? ? ? ? ? ? ? ? ? ?if(con.State==ConnectionState.Open)
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? con.Close();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?try
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? SqlDataAdapterda =new SqlDataAdapter(sqlText,con);
? ? ? ? ? ? ? ? ? ? ? ? ? ? //da.SelectCommand=new SqlCommand(sqlText,con);
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataSetds=new DataSet();
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.Fill(ds,"customers");//填充給DataSet中的Customeres表
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataTabledt=ds.Tables["customers"];
? ? ? ? ? ? ? ? ? ? ? ? ? ? //下面一句就是把dt表中的記錄有賦給了DataView dv 然后對(duì)dv進(jìn)行操作 DataView有自己的動(dòng)態(tài)方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataViewdv =new DataView(dt,"country='Germany'","country",DataViewRowState.CurrentRows);
? ? ? ? ? ? ? ? ? ? ? ? ? ? //其中第一個(gè)參數(shù)是DataTale,第二個(gè)是對(duì)DataTable內(nèi)容進(jìn)行篩選的篩選器,第三個(gè)是排序,最后一個(gè)參數(shù)指定要在視圖中包含的行的類(lèi)型
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach(DataRowViewdrv in dv)
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?for(inti=0;i<dv.Table.Columns.Count;i++)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.Write(drv[i]+ "\t");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Console.WriteLine();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? Console.ReadLine();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?catch (Exception ex)
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("Error:"+ ex);
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?finally
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? con.Close();
? ? ? ? ? ? ? ? ? ? ?}
?
? ? ? ? ? ? ? }
? ? ? ?4.4)修改數(shù)據(jù)集中的記錄 ? 其實(shí)這個(gè)4.4)單獨(dú)是沒(méi)有意義的 應(yīng)該是4.5以后將更新保存到數(shù)據(jù)庫(kù)源
? ? ? ? ? ?說(shuō)明:對(duì)數(shù)據(jù)集所做的變化不會(huì)自動(dòng)保存到數(shù)據(jù)庫(kù)中,為了把這些變化保存到數(shù)據(jù)庫(kù)中,需要再次連接數(shù)據(jù)庫(kù),顯示完成更新
? ? ? ? ? ?例子:
? ? ? ? ? ? ? staticvoid Main()
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?stringConnetionString=@"data source=localhost;initial catalog=northwind;user id=sa;password=sa;";
? ? ? ? ? ? ? ? ? ? ?stringqry=@"select * from employees where country='UK'";
? ? ? ? ? ? ? ? ? ? ?stringudp=@"update employees set city=@city where employeeid=@employeeid";
? ? ? ? ? ? ? ? ? ? ?SqlConnection con =newSqlConnection(ConnetionString);
? ? ? ? ? ? ? ? ? ? ?try
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? SqlDataAdapterda= new SqlDataAdapter();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?da.SelectCommand=new SqlCommand(qry,con);
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataSetds=new DataSet(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.Fill(ds,"employees");
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataTabledt=ds.Tables["employees"];
? ? ? ? ? ? ? ? ? ? ? ? ? ? //以下更改了表的信息
? ? ? ? ? ? ? ? ? ? ? ? ? ? dt.Columns["FirstName"].AllowDBNull=true;
? ? ? ? ? ? ? ? ? ? ? ? ? ? dt.Rows[0]["city"]="Wilmington";
? ? ? ? ? ? ? ? ? ? ? ? ? ? //以下為表添加了新行
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataRownewRow =dt.NewRow();
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["firstname"]="li";
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["lastname"]="yong";
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["titleofcourtesy"]="haha";
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["city"]="dalian";
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["country"]="UK";
? ? ? ? ? ? ? ? ? ? ? ? ? ? dt.Rows.Add(newRow);
? ? ? ? ? ? ? ? ? ? ? ? ? ? //可以顯示更新后的信息 這時(shí)只更新了數(shù)據(jù)集 但是沒(méi)有更新數(shù)據(jù)庫(kù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach(DataRowrow in ?dt.Rows)
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Console.WriteLine("{0}{1}{2}",row["firstname"].ToString().PadRight(15),row["lastname"].ToString().PadLeft(25),row["city"]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.ReadLine();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?catch(Exceptionex)
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("Error:"+ ex);
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?finally
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? con.Close();
? ? ? ? ? ? ? ? ? ? ?}、
?
? ? ? ? ? ? ? 4.5)將變化保存到數(shù)據(jù)源
? ? ? ? ? ? ? ? ? ? ?以下3個(gè)屬性可用于把數(shù)據(jù)集中的數(shù)據(jù)更新和同步到數(shù)據(jù)源(類(lèi)似于支持查詢(xún)的SelectCommand屬性)
? ? ? ? ? ? ? ? ? ? ?*UpdateCommand
? ? ? ? ? ? ? ? ? ? ?*InsertCommand
? ? ? ? ? ? ? ? ? ? ?*DeleteCommand
? ? ? ? ? ? ? ***A)UpdateCommand屬性
? ? ? ? ? ? ? ? ? ? ?SqlDataAdapterda =new SqlDataAdapter();
? ? ? ? ? ? ? ? ? ? ?要想對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改要是動(dòng)態(tài)的必須有參數(shù)
? ? ? ? ? ? ? ? ? ? ?//以下這是第二次操作數(shù)據(jù)庫(kù)(用SqlCommand)進(jìn)行更改
? ? ? ? ? ? ? ? ? ? ?SqlCommandcmd=new SqlCommand(upd,conn);//udp為SQL語(yǔ)句 它是有參數(shù)的
? ? ? ? ? ? ? ? ? ? ?cmd.Parameters.Add("@city",SqlDbType.NVarChar,15,"city");//為upd語(yǔ)句設(shè)定兩個(gè)參數(shù)
? ? ? ? ? ? ? ? ? ? ?cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid");
? ? ? ? ? ? ? ? ? ? ?da.UpdateCommand=cmd;
? ? ? ? ? ? ? ? ? ? ?da.Update(ds,"表名");
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ?
? ? ? ? ? ? ? staticvoid Main()
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?stringConnectionString =@"data source =localhost;initial catalog=northwind;userid =sa;password=sa;";
? ? ? ? ? ? ? ? ? ? ?stringqry=@"select * from employees where country='UK'";//用于從庫(kù)中取出數(shù)據(jù)進(jìn)行更改用的SQL
? ? ? ? ? ? ? ? ? ? ?stringupd=@"update employees set city=@city where employeeid=@employeeid";//更改的SQL
? ? ? ? ? ? ? ? ? ? ?SqlConnectionconn =new SqlConnection(ConnectionString);
? ? ? ? ? ? ? ? ? ? ?try
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? SqlDataAdapterda =new SqlDataAdapter();
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.SelectCommand=newSqlCommand(qry,conn);
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataSet ds=new DataSet();
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.Fill(ds,"employees");
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataTabledt=ds.Tables["employees"];
? ? ? ? ? ? ? ? ? ? ? ? ? ? (a)dt.Rows[0]["city"]="Wilmington11";//改后的信息 其實(shí)是SQL update語(yǔ)句的參數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? //以下只是數(shù)據(jù)集做了更改后顯示出來(lái)
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach(DataRowrow in dt.Rows)
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Console.WriteLine("{0}{1}{2}",row["firstname"].ToString().PadRight(15),row["lastname"].ToString().PadLeft(25),row["city"]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? //這以下才是對(duì)數(shù)據(jù)庫(kù)進(jìn)行的真正更改
? ? ? ? ? ? ? ? ? ? ? ? ? ? SqlCommandcmd=new SqlCommand(upd,conn);//udp為SQL語(yǔ)句 它的參數(shù)是(a)
? ? ? ? ? ? ? ? ? ? ? ? ? ? //設(shè)定兩個(gè)參數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cmd.Parameters.Add("@city",SqlDbType.NVarChar,15,"city");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? da.UpdateCommand=cmd;//修改賦值
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.Update(ds,"employees");//修改
?
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?catch(Exceptionex)
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("Error:"+ex);
? ? ? ? ? ? ? ? ? ? ?}
?
? ? ? ? ? ? ? ***B)InsertCommand屬性
? ? ? ? ? ? ? ? ? ? ?數(shù)據(jù)適配器使用InsertCommand屬性在表中插入行,調(diào)用Update方法時(shí),將搜索以前添加到表中的說(shuō)有新行,并保存到數(shù)據(jù)庫(kù)中。
? ? ? ? ? ? ? ? ? ? ?staticvoid Main()
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ?stringConnectionString =@"data source=localhost;initial catalog=northwind;userid =sa;password=sa";
? ? ? ? ? ? ? ? ? ? ?stringqry=@"select * from employees where country='UK'"; //第一步 從庫(kù)中取數(shù)據(jù)SQL語(yǔ)句
? ? ? ? ? ? ? ? ? ? ?stringins=@"
? ? ? ? ? ? ? ? ? ? ?insertinto employees(firstname,lastname,titleofcourtesy,city,country) ? //第二步SQL更改語(yǔ)句
? ? ? ? ? ? ? ? ? ? values
? ? ? ? ? ? ? ? ? ? ?(
? ? ? ? ? ? ? ? ? ? ? ? ? ? @firstname,
? ? ? ? ? ? ? ? ? ? ? ? ? ? @lastname,
? ? ? ? ? ? ? ? ? ? ? ? ? ? @titleofcourtesy,
? ? ? ? ? ? ? ? ? ? ? ? ? ? @city,
? ? ? ? ? ? ? ? ? ? ? ? ? ? @country
? ? ? ? ? ? ? ? ? ? ?)
? ? ? ? ? ? ? ? ? ? ?";
? ? ? ? ? ? ? ? ? ? ?SqlConnectionconn =new SqlConnection(ConnectionString);
? ? ? ? ? ? ? ? ? ? ?try
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? SqlDataAdapterda=new SqlDataAdapter();
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.SelectCommand=newSqlCommand(qry,conn);
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataSetds =new DataSet();
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.Fill(ds,"employees");
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataTabledt=ds.Tables["employees"];//已把原庫(kù)中的數(shù)據(jù)賦值給了dt
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataRownewRow =dt.NewRow();
? ? ? ? ? ? ? ? ? ? ? ? ? ? //以下添加的每列新行就是 下面參數(shù)的要賦的新值
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["firstname"]="li";
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["lastname"]="yong";
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["titleofcourtesy"]="Sir";
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["city"]="Birmingham";
? ? ? ? ? ? ? ? ? ? ? ? ? ? newRow["country"]="UK";
? ? ? ? ? ? ? ? ? ? ? ? ? ? dt.Rows.Add(newRow);//然后為dt添加一個(gè)新行
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach(DataRowrow in dt.Rows)//把現(xiàn)在的結(jié)果遍例出來(lái)
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Console.WriteLine("{0}{1}{2}",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? row["firstname"].ToString().PadRight(15),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? row["lastname"].ToString().PadLeft(25),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? row["city"].ToString().PadLeft(35)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? );
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? SqlCommandcmd =new SqlCommand(ins,conn);//傳遞InsertCommand SQL更改命令
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //以下是設(shè)定InsertCommand參數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cmd.Parameters.Add("@firstname",SqlDbType.NVarChar,10,"firstname");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cmd.Parameters.Add("@lastname",SqlDbType.NVarChar,20,"lastname");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cmd.Parameters.Add("@titleofcourtesy",SqlDbType.NVarChar,25,"titleofcourtesy");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cmd.Parameters.Add("@city",SqlDbType.NVarChar,15,"city");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cmd.Parameters.Add("@country",SqlDbType.NVarChar,15,"country");
? ? ? ? ? ? ? ? ? ? ? ? ? ? 以下兩句是真正的更改數(shù)據(jù)庫(kù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.InsertCommand=cmd;
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.Update(ds,"employees");
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.ReadLine();
?
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?catch(Exceptionex)
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("Error:"+ex);
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.ReadLine();
? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?finally
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? conn.Close();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? ***C)DeleteCommand屬性
? ? ? ? ? ? ? DeleteCommand屬性可用于執(zhí)行SQLDELETE語(yǔ)句。
? ? ? ? ? ? ?
? ? ? ? ? ? ? staticvoid Main()
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?stringConnectionString =@"data source =localhost;initial catalog=northwind;userid =sa;password=sa;";
? ? ? ? ? ? ? ? ? ? ?stringqry=@"select * from employees where country='UK'";//第一步 從庫(kù)中取數(shù)據(jù)SQL語(yǔ)句
? ? ? ? ? ? ? ? ? ? ?stringdel=@"delete from employees where employeeid =@employeeid"; //第二步SQL更改語(yǔ)句
? ? ? ? ? ? ? ? ? ? ?SqlConnectioncon=new SqlConnection(ConnectionString);
? ? ? ? ? ? ? ? ? ? ?try
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? //注釋: 雖然這段代碼用的delete語(yǔ)句用到了參數(shù)whereemployeeid =@employeeid
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//但是在下面又用到了filt 篩選條件 所以明確了用名字來(lái)判斷 那么where employeeid =@employeeid就沒(méi)有意義了
? ? ? ? ? ? ? ? ? ? ? ? ? ? SqlDataAdapterda=new SqlDataAdapter();
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.SelectCommand=new SqlCommand(qry,con);
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataSetds=new DataSet();
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.Fill(ds,"employees");
? ? ? ? ? ? ? ? ? ? ? ? ? ? DataTabledt =ds.Tables["employees"]; ?//把原來(lái)的數(shù)據(jù)庫(kù)中數(shù)據(jù)提取出來(lái)賦給dt
? ? ? ? ? ? ? ? ? ? ? ? ? ? SqlCommandcmd=new SqlCommand(del,con); ?//傳遞DeleteCommand SQL更改命令
? ? ? ? ? ? ? ? ? ? ? ? ? ? cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid"); ?//為DeleteCommand添加參數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? stringfilt=@"firstname='li' and lastname='yong'";//篩選條件
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach(DataRowrow in dt.Select(filt))
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?row.Delete();
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? //以下兩句真正刪除數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.DeleteCommand=cmd;
? ? ? ? ? ? ? ? ? ? ? ? ? ? da.Update(ds,"employees");
? ? ? ? ? ? ? ? ? ? ? ? ? //把現(xiàn)在的結(jié)果集遍例出來(lái)
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach(DataRowrow in dt.Rows)
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Console.WriteLine("{0}{1}{2}",row["firstname"].ToString().PadRight(15),row["lastname"].ToString().PadLeft(25),row["city"]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.ReadLine();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?catch(Exceptionex)
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("Error:"+ ex);
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ?finally
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? con.Close();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? }
? ? ? ?五) 關(guān)于DataRowView 的用法(此時(shí)要想得到listBox選中的數(shù)據(jù)(前提是把數(shù)據(jù)庫(kù)中的數(shù)據(jù)賦給listBox))
? ? ? ? ? ? ? ? ? ? ?DataRowViewrowView=(DataRowView)this.listBox1.Items[this.listBox1.SelectedIndex];
? ? ? ? ? ? ? ? ? ? ?stringstr=rowView.Row.ItemArray[0].ToString();
? ? ? ? ? ? ? ? ? ? ?MessageBox.Show("您選擇的是:"+str,"***這種方法只能這樣寫(xiě)代碼,請(qǐng)看看");
? ? ? ? ? ? ? ***詳見(jiàn)級(jí)聯(lián)菜單的例子
?
? ? ? ? ? ? ?
? ? ? ?用以下的cmd命令可以創(chuàng)建一個(gè)新的iis站點(diǎn):
?
C:\Inetpub\AdminScripts> adsutil.vbscreate_vserv W3SVC/2
C:\Inetpub\AdminScripts> adsutil.vbscopy W3SVC/1 W3SVC/2
?
刪除:
?
C:\Inetpub\AdminScripts> adsutil.vbsdelete W3SVC/2
?
List:
?
C:\Inetpub\AdminScripts> adsutil.vbsenum w3svc /p
?
當(dāng)然,創(chuàng)建了以后也只能同時(shí)運(yùn)行一個(gè)。 ? ? ?
========
總結(jié)
以上是生活随笔為你收集整理的C# 操作Sql Server 学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C#二进制文件编程实践
- 下一篇: C# 消息处理学习总结