一、實驗目的
- 掌握ADO .NET數據離線與在線訪問模型;
- 掌握應用LINQ進行數據查詢;
二、實驗內容
- 基於ADO.NET技術進行數據操作
已提供一個控制檯程序的框架。附件中提供了各種格式的Northwind數據庫。
參考案例程序,連接上數據庫,進行各種操作,補全該程序。
一些可用的SQL語句:
select * from 客戶 where 城市='南京'//找到所有位於南京的客戶
select count(*) from 客戶 where 城市='南京'//統計南京客戶的數量
update 客戶 set 城市='天津' where 客戶ID='ALFKI'//更新客戶信息,若滿足條件,就將“城市”字段改爲天津
可自由選擇所查詢的數據庫表和參數。注意,SQL中字符串需加單引號。
class Test
{
static string _mdbFile = "D:/Northwind.mdb";
static OleDbConnection _connection;
static OleDbDataAdapter _adapter;
static DataSet _dataset;
public static void Main(string[] argv)
{
while (true)
{
int index = 1;
Console.WriteLine("=====Menu=====");
Console.WriteLine(index++ + ". 連接數據庫");
Console.WriteLine(index++ + ". 查詢數據行");
Console.WriteLine(index++ + ". 數據統計");
Console.WriteLine(index++ + ". 更新數據庫");
Console.WriteLine(index++ + ". 數據庫離線查詢");
Console.WriteLine(index++ + ". 離線LINQ查詢");
Console.WriteLine(index++ + ". 斷開數據庫");
Console.WriteLine(index++ + ". 退出");
Console.WriteLine("=====End======");
Console.Write("請選擇一個操作:");
string input = Console.ReadLine();
int choice;
bool isDigit = int.TryParse(input, out choice);
if (!isDigit || choice >= index || choice < 1)
{
Console.WriteLine("錯誤選項");
}
if (choice == index - 1)
break;
switch (choice)
{
case 1:
ConnectToDB();
break;
case 2:
QueryWithReader();
break;
case 3:
QueryScalar();
break;
case 4:
UpdateOnLine();
break;
case 5:
QueryOffLine();
break;
case 6:
LINQQuery();
break;
case 7:
CloseDB();
break;
}
Console.WriteLine();
}
}
public static bool IsConnected()
{
if (_connection == null || _connection.State != ConnectionState.Open)
{
Console.WriteLine("數據庫未連接");
return false;
}
return true;
}
public static void ConnectToDB()
{
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _mdbFile;
_connection = new OleDbConnection(connString);
//補全
}
public static void QueryWithReader()
{
if (!IsConnected())
return;
var command = _connection.CreateCommand();
//補全
}
public static void QueryScalar()
{
}
public static void UpdateOnLine()
{
}
public static void QueryOffLine()
{
}
public static void LINQQuery()
{
}
public static void CloseDB()
{
}
}
源代碼
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Homework12
{
class Test
{
static string _mdbFile = "E:\\School Life\\University\\Study\\計算機\\程序語言\\C#\\第十三次課0529\\Northwind\\Northwind.mdb";
static OleDbConnection _connection;
static OleDbDataAdapter _adapter;
static DataSet _dataset;
public static void Main(string[] argv)
{
while (true)
{
int index = 1;
Console.WriteLine("=====Menu=====");
Console.WriteLine(index++ + ". 連接數據庫");
Console.WriteLine(index++ + ". 查詢數據行");
Console.WriteLine(index++ + ". 數據統計");
Console.WriteLine(index++ + ". 更新數據庫");
Console.WriteLine(index++ + ". 數據庫離線查詢");
Console.WriteLine(index++ + ". 離線LINQ查詢");
Console.WriteLine(index++ + ". 斷開數據庫");
Console.WriteLine(index++ + ". 退出");
Console.WriteLine("=====End======");
Console.Write("請選擇一個操作:");
string input = Console.ReadLine();
int choice;
bool isDigit = int.TryParse(input, out choice);
if (!isDigit || choice >= index || choice < 1)
{
Console.WriteLine("錯誤選項");
}
if (choice == index - 1)
break;
switch (choice)
{
case 1:
ConnectToDB();
break;
case 2:
QueryWithReader();
break;
case 3:
QueryScalar();
break;
case 4:
UpdateOnLine();
break;
case 5:
QueryOffLine();
break;
case 6:
LINQQuery();
break;
case 7:
CloseDB();
break;
}
Console.WriteLine();
}
}
public static bool IsConnected()
{
if (_connection == null || _connection.State != ConnectionState.Open)
{
Console.WriteLine("數據庫未連接");
return false;
}
return true;
}
public static void ConnectToDB()
{
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _mdbFile;
_connection = new OleDbConnection(connString);
//補全
try
{
_connection.Open();
Console.WriteLine("數數據庫連接成功:" + _mdbFile + " is " + _connection.State);
}
catch(Exception e){
Console.WriteLine(e.Message);
_connection.Close();
}
finally {
}
}
public static void QueryWithReader()
{
if (!IsConnected())
return;
var command = _connection.CreateCommand();
//補全
command.CommandText = "select * from 客戶 where 城市='南京'";
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader[0].ToString());
}
reader.Close();
}
public static void QueryScalar()
{
if (!IsConnected())
return;
var command = _connection.CreateCommand();
command.CommandText = "select count(*) from 客戶 where 城市='南京'";
int count = (int)command.ExecuteScalar();
Console.WriteLine("記錄總數:"+count);
}
public static void UpdateOnLine()
{
if (!IsConnected())
return;
var command = _connection.CreateCommand();
command.CommandText = "update 客戶 set 城市='天津' where 客戶ID='ALFKI'";
int count = (int)command.ExecuteNonQuery();
Console.WriteLine("更新 " + count + " 行");
}
public static void QueryOffLine()
{
if (!IsConnected())
return;
var command = _connection.CreateCommand();
command.CommandText = "select * from 客戶";
_dataset = new DataSet();
DataTable dt1 = new DataTable("Scene");
_dataset.Tables.Add(dt1);
_adapter = new OleDbDataAdapter(command);
_adapter.Fill(dt1);
var query = from x in dt1.AsEnumerable()
select x;
foreach (DataColumn column in dt1.Columns)
Console.Write(column.ColumnName+"\t");
Console.WriteLine();
foreach (var row in query){
foreach (DataColumn column in dt1.Columns)
Console.Write(row[column.ColumnName] + "\t");
Console.WriteLine();
}
}
public static void LINQQuery()
{
if (!IsConnected())
return;
var command = _connection.CreateCommand();
command.CommandText = "select * from 客戶 where 城市='南京'";
_dataset = new DataSet();
DataTable dt1 = new DataTable("Scene");
_dataset.Tables.Add(dt1);
_adapter = new OleDbDataAdapter(command);
_adapter.Fill(dt1);
var query = from x in dt1.AsEnumerable()
where (string)x["城市"] == "南京"
select x;
foreach (DataColumn column in dt1.Columns)
Console.Write(column.ColumnName + "\t");
Console.WriteLine();
foreach (var row in query)
{
foreach (DataColumn column in dt1.Columns)
Console.Write(row[column.ColumnName] + "\t");
Console.WriteLine();
}
}
public static void CloseDB()
{
if (!IsConnected())
return;
_connection.Close();
Console.WriteLine("數數據庫關閉成功:" + _mdbFile + " is " + _connection.State);
}
}
}
運行結果
三、實驗心得與體會
- 掌握ADO .NET數據離線與在線訪問模型;
- 掌握應用LINQ進行數據查詢;
參考文章
https://blog.csdn.net/zac_sian/article/details/51161563
https://www.runoob.com/csharp/csharp-for-loop.html
https://docs.microsoft.com/zh-cn/dotnet/api/system.data.datarow?view=netframework-4.8