
有時候我們會提供頁面給使用者做資料修改,為了怕使用者填寫錯誤,會用下拉式選單(DropdownList),讓使用者填寫,但是也要提示使用者上一次記錄的資料內容。因此將資料庫中的資料與下拉式選單作對應是很常會遇到的事情。
理論上,資料庫中記錄的資料內容儲存值應該會是越少越好。也就是說,如果以下拉式選單如下面所示,要記錄在資料庫中的應該是ListItem Value的值。對資料儲存來說比較有利,也可以降低資料庫容量成長。

轉到頭都暈了的資料型態轉換!
這天,為了讓SQL與程式的功能作區分,畢竟資料庫負責處理資料,而程式是負責運算,為了讓雙方回歸到基本的運作模式,因此嘗試著重新編譯程式,卻發現之前資料庫的語法編譯之後雖然造成程式效能不彰,但卻讓程式簡單的幾句就達到我要的結果(簡單的說..就是資料庫我讓他進行不少的運算,最後再將接近結果的資料表丟給程式做最後的運算跟寫入資料庫。)
仔細想想,乾脆就都用資料庫就好啦(其實是辦的到的!)但這樣跟原本設定要給USER隨時上傳資料的意義就消失了。(反正我是程式新手..就用不同的狀況讓我更瞭解C#語法吧!)
言歸正傳,這次遇到的問題是當我從資料庫中提取一出Decimal的資料,但轉入到程式中出現了以下錯誤訊息:”將字串轉換為DataTime時…或是需要的型別是Int32…與輸入的字串格式不正確…“,大冒險就開始了,瘋狂的查詢與測試後(就是要用程式解決啦!!)不過還是沒解決資料載入時的資料型態問題>”<
例如:
DB Data1 : 60.000000 à 60
DB Data2 : 22.000000 à 22
從資料庫取出到DataTable中變成字串,簡單看起來應該是我的資料來源被當成String,但是我要他是Int32。
因此我做了轉成整數的動作
String ABC = 123.000;
int PHAMTF = new int();
PHAMTF = int.Parse(PHAMT);
但是,還是出現錯誤訊息”需要的型別是Int32”,我想主要的原因應該是我的資料是有小數點的,翻閱文件後,我將語法改為:
首先先增加using System.Globalization 命名空間
System.Globalization 命名空間 (Namespace) 包含定義文化特性相關資訊的類別,包括語言、國家/地區、使用中的曆法、日期、貨幣和數字格式模式,以及字串的排序順序。
String ABC = 123.000;
int PHAMTF = new int();
PHAMTF = int.Parse(PHAMT, NumberStyles.AllowDecimalPoint);
輸出結果:123
詳細說明請參閱TechNet:
Int32.Parse 方法 (String, NumberStyles)
http://msdn.microsoft.com/zh-tw/library/c09yxbyt.aspx
Convert 類別(將基底資料型別轉換為其他基底資料型別。)
http://msdn.microsoft.com/zh-tw/library/system.convert(v=VS.80).aspx
PS:改寫途中,其中一度想放棄,乾脆用資料庫語法CAST 和 CONVERT (Transact-SQL)來直接修正欄位值,將欄位值直接改成Int ,這樣我接資料就沒問題啦……
---範例語法(複製後貼上SSMS執行即可)----
DECLARE @myval decimal (5, 2)
SET @myval = 193.57
SELECT CAST(@myval AS Int) AS Myval
-- Or, using CONVERT
SELECT CONVERT(int, @myval) AS Myval
改天在來好好寫一篇關於CAST 和 CONVERT (Transact-SQL)
詳細說明請參閱TechNet:http://msdn.microsoft.com/zh-tw/library/ms187928.aspx
後記:仔細想想,應該是我對於程式中,資料的來源、承接、型態、結構、方法等..所有東西都不熟悉所導致的吧@@,以致於我根本不知道要修正哪裡的錯誤來解決問題…都是用猜的跟用矇的……
給我排排站好..其餘免談@@|||
由於資料有時候並不會有流水序號可供判定資料的位置,因此就會需要讓他產生流水編號,產生的方法有以下幾種函數,排名函數會傳回資料分割中每個資料列各一個次序值。根據所用的函數而定,有些資料列可能會收到與其他資料列相同的值。排名函數不具決定性。
ROW_NUMBER() 從頭排到尾
RANK() 依據相同的值給予同一編號,但是下次給號”會跳號”(常用於排名次)
DENSE_RANK() 依據相同的值給予同一編號,但是下次給號”不會跳號”
NTILE() 依據給予的引數,給予資料列散發到指定數目的群組中,對於每個資料列,NTILE 都會傳回資料列所屬群組的號碼。
詳細說明請參閱TechNet
https://technet.microsoft.com/zh-tw/library/ms189798.aspx
------以下是範例直接複製到SSMS執行即可-------
--DECLARE @Table,宣告一個變數資料表
DECLARE @Employee TABLE
( EmpId Varchar(10),
EmpName Varchar(25),
EmpSalary Numeric(12,0)
)
--Insert sample records,寫入幾筆樣本資料
INSERT INTO @Employee VALUES( 'Emp202', 'Ravi', 2000000)
INSERT INTO @Employee VALUES( 'Emp198', 'Shekar', 678000)
INSERT INTO @Employee VALUES( 'Emp234', 'Karim', 805000)
INSERT INTO @Employee VALUES( 'Emp234', 'Karim', 879000)
INSERT INTO @Employee VALUES( 'Emp234', 'Karim', 2350000)
INSERT INTO @Employee VALUES( 'Emp184', 'John', 975000)
INSERT INTO @Employee VALUES( 'Emp151', 'Suresh', 689000)
INSERT INTO @Employee VALUES( 'Emp151', 'Suresh', 879000)
--Query the table,執行語法!
SELECT
ROW_NUMBER() OVER ( ORDER BY EmpId DESC ) AS 依照EmpId排序,
EmpId, EmpName, EmpSalary
FROM @Employee
SELECT
ROW_NUMBER() OVER ( PARTITION BY EmpName ORDER BY EmpId DESC ) AS 依照EmpName群組後排序,
EmpId, EmpName, EmpSalary
FROM @Employee
SELECT
RANK() OVER(ORDER BY EmpId) AS 跳號 ,
EmpId, EmpName, EmpSalary
FROM @Employee
SELECT
DENSE_RANK() OVER(ORDER BY EmpId) AS 不會跳號 ,
EmpId, EmpName, EmpSalary
FROM @Employee
SELECT
NTILE(3) OVER(ORDER BY EmpId) AS 每三列編一號 ,
EmpId, EmpName, EmpSalary
FROM @Employee
PS:很常用的東西…但是卻也很常忘記…>”<
不負責任講座…開課嚕!!
今天嘗試安裝SQL 2008 其實公司有金鑰但是卻沒有使用,因此今天打算來安裝一套作為以後的資料庫,雖然我更想安裝SQL 2008 R2,但是一切都要錢阿……
嘗試安裝以後更改路徑,例如想把“C:\Program Files\Microsoft SQL Server” 修改為“D:\Program Files\Microsoft SQL Server”
出現錯誤訊息,安裝失敗,錯誤的詳細資訊是:
未指定 INSTANCESHAREDDIR 命令列值。如果指定了 INSTANCESHAREDWOWDIR 值,就必須指定這個值。
上網查詢了一下,大致解決方法如下:
首先:不修改路徑,使用默認方式安裝,最後在確認安裝時會顯示ConfigurationFile.ini檔的路徑,到這個路徑下面將安裝配置檔複製到其他路徑,例如D:\,然後退出安裝
其次:使用記事本打開這個檔,根據實際需求將“C:\Program Files\Microsoft SQL Server” 查找替換為“D:\Program Files\Microsoft SQL Server”後存檔,
最後:在命令行轉到安裝目錄,開始安裝,如果是Vista,記得使用管理員許可權運行命令行,輸入以下指令: setup.exe /action=Install /configurationfile=D:\ConfigurationFile.ini
這時執行就會按照之前設定的路徑下去執行 。
另一方法:
插入光碟後不要用Autorun的安裝,使用CMD命令安裝!進安裝光碟的根目錄,輸入命令:
setup.exe /INSTALLSHAREDDIR="D:\\Program Files\\Microsoft SQL Server\\"/INSTALLSHAREDWOWDIR="D:\\Program Files (x86)\\Microsoft SQL Server\\"
安裝即可,其中INSTALLSHAREDDIR為x64部件安裝的路徑,INSTALLSHAREDWOWDIR為x32部件安裝的路徑。
以上是網路提供的方法...改天來試看看!!
PS:昨天測試了一下,確實可以利用以上方式進行安裝...但是我還是失敗阿!(出現其他種類的錯誤)
(也發現要一邊寫記錄一邊處理錯誤...真的很困難>"<|||,驚覺要留下記錄或是圖片時..都已經來不及啦!)
參考來源:
訊息3032,層級16,狀態2,行1
這個陳述式不支援一或多個選項(no_log)。請查閱文件集,了解支援的選項。
意外發現原來SQL 2008 取消了部分的查詢語法與功能,如果如MSDN文件所說的,也就是以後要截斷交易記錄,必須要利用其他方式,或是利用正規的語法備份。雖然不方便,但是依照正常的邏輯推論,的確是應該這樣沒錯!
--查詢資料庫使用空間
參考資料:
德瑞克:SQL Server 學習筆記
交易記錄檔已滿、爆掉;截斷交易記錄檔。(The transaction log for database 'DB1' is full. ;Transaction Log Truncation)
管理交易記錄
http://technet.microsoft.com/zh-tw/library/ms345382.aspx
簡單復原模式下的備份
http://technet.microsoft.com/zh-tw/library/ms191164.aspx