using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data; //引用三個命名空間
using System.Data.SqlClient;
using System.Configuration;/// <summary>
/// DB 的摘要說明
/// </summary>
public class DB
{public DB(){//// TODO: 在此處添加構造函數邏輯//}/// <summary>/// 用于執行返回單個值的select語句/// </summary>/// <param name="sql">只返回單個值的select語句</param>/// <returns>查到的一個值,查詢失敗返回null</returns>// 定義一個公開的方法,該方法接受一個SQL查詢字符串作為參數,并返回一個object類型的值。
public object queryOneValue(string sql)
{ // 從Web.config文件中獲取名為"myDBConnectionString"的數據庫連接字符串。 string connStr = ConfigurationManager.ConnectionStrings["myDBConnectionString"].ConnectionString; // 使用上面獲取的連接字符串構造一個SqlConnection對象,用于與數據庫建立連接。 SqlConnection conn = new SqlConnection(connStr); try { // 打開數據庫連接。 conn.Open(); // 使用提供的SQL查詢字符串和已建立的數據庫連接構造一個SqlCommand對象。 SqlCommand comm = new SqlCommand(sql, conn); // 執行SqlCommand對象中的SQL命令,并返回查詢結果中的第一行第一列的值(如果有的話)。 // 這通常用于返回單個值,如COUNT(*)的結果或SELECT TOP 1 ...的結果。 object ret = comm.ExecuteScalar(); // 返回查詢到的值(如果有的話)。 return ret; } catch (Exception ex) { // 如果在執行過程中發生任何異常,捕獲該異常并返回null。 // 這里應該記錄異常信息以便后續調查,但此示例中未顯示。 return null; } finally { // 無論是否發生異常,都會執行finally塊中的代碼。 // 檢查數據庫連接是否仍然打開。 if (conn.State == ConnectionState.Open) { // 如果連接是打開的,則關閉它。 conn.Close(); } }
}// 定義一個公開的方法,該方法接受一個SQL命令字符串作為參數,并返回一個int類型的值。
// 通常,這個返回值表示受影響的行數。
public int ExecuteNonQueryCommand(string sql)
{ // 從Web.config文件中獲取名為"myDBConnectionString"的數據庫連接字符串。 string connStr = ConfigurationManager.ConnectionStrings["myDBConnectionString"].ConnectionString; // 使用上面獲取的連接字符串構造一個SqlConnection對象,用于與數據庫建立連接。 SqlConnection conn = new SqlConnection(connStr); try { // 打開數據庫連接。 conn.Open(); // 使用提供的SQL命令字符串和已建立的數據庫連接構造一個SqlCommand對象。 SqlCommand comm = new SqlCommand(sql, conn); // 執行SqlCommand對象中的SQL命令,并返回受影響的行數。 // 這通常用于執行INSERT、UPDATE、DELETE等不返回結果集的命令。 int ret = comm.ExecuteNonQuery(); // 返回受影響的行數。 return ret; } catch (Exception ex) { // 如果在執行過程中發生任何異常,捕獲該異常并返回一個特殊的值(-1)表示操作失敗。 // 這里應該記錄異常信息以便后續調查,但此示例中未顯示。 return -1; } finally { // 無論是否發生異常,都會執行finally塊中的代碼。 // 檢查數據庫連接是否仍然打開。 if (conn.State == ConnectionState.Open) { // 如果連接是打開的,則關閉它。 conn.Close(); } }
}
- 使用?
ExecuteScalar
?時,你應確保SQL查詢返回單個值(或沒有值,這將返回null)。如果查詢返回多行多列的數據,則?ExecuteScalar
?將只返回第一行第一列的值,并忽略其他行和列。 - 在使用數據庫連接時,使用?
try-catch-finally
?結構可以確保即使在發生異常的情況下,連接也能被正確關閉。這是一個很好的編程實踐。
"不返回結果集" 指的是執行 SQL 語句后,數據庫不會返回一個可以逐行讀取的數據集(如查詢結果)。對于 SQL 語句,我們可以大致分為兩類:返回結果集的語句和不返回結果集的語句。
返回結果集的語句
這類語句通常用于從數據庫中檢索數據,例如?
SELECT
?語句。當你執行一個?SELECT
?語句時,數據庫會返回一個結果集,你可以遍歷這個結果集來讀取查詢到的數據。不返回結果集的語句
這類語句通常用于修改數據庫中的數據或結構,而不是檢索數據。以下是一些不返回結果集的 SQL 語句的例子:
- 數據修改語句:
INSERT
:向表中插入新行。UPDATE
:更新表中的現有行。DELETE
:從表中刪除行。- 數據定義語句:
CREATE
:創建新的數據庫、表、索引等。ALTER
:修改現有的數據庫、表、索引等。DROP
:刪除數據庫、表、索引等。- 其他:
SET
:在事務中設置變量或更改數據庫會話的某些設置。TRUNCATE
:刪除表中的所有行,但不記錄單獨的行刪除操作。當執行這些不返回結果集的語句時,
SqlCommand.ExecuteNonQuery()
?方法被用于執行命令。它返回一個整數,表示受影響的行數(對于?INSERT
、UPDATE
?和?DELETE
?語句)或表示命令是否成功執行(對于?CREATE
、ALTER
?和?DROP
?語句,盡管不是所有數據庫系統都會為這些命令返回受影響的行數)。總結
"不返回結果集" 意味著執行 SQL 語句后,你不會得到一個可以逐行讀取的數據集。相反,你可能會得到一個表示受影響的行數的整數,或者只是一個表示命令是否成功執行的確認。