2012-02-16

Delphi 7連線SQLite資料庫

最近在研究於Delphi7中利用ODBC連線SQLite DB檔案,
將實做成功方法做個記錄。

先安裝SQLite ODBC Driver
//**在ADO內的ConnectionString直接帶入,不用連線精靈
procedure _SetSQLiteDBConnection;
var OD : TOpenDialog;
    ADOConn : TADOConnection;
    xDatabase : String;
begin
  OD := TOpenDialog.Create(NIL);

  OD.FileName := 'x:\mymoney';//**預設資料庫路徑
  OD.DefaultExt := '*.db';//**預設存檔格式
  OD.Filter := 'DB files (*.db)|*.DB';//**過濾顯示的檔案格式
  if Not OD.Execute then
  begin
    showmessage('選擇資料庫檔案失敗!');
    Abort;
  end;

  xDatabase := ';Database='+OD.FileName;
  ADOConn := TADOConnection.Create(NIL);
  ADOConn.LoginPrompt := False;
  ADOConn.ConnectionString := 'Driver={SQLite3 ODBC Driver}'+xDatabase;

  while Not ADOConn.Connected do
    ADOConn.Open;
end;


參考自 网语飘飘.Net/Delphi攻坚战

2012-02-11

MS SQL Stored Procedure 初心者筆記

1.使用Exec執行動態SQL語法,若語法內有產生暫存Table,在執行結束後一併消失,故可以先在外面CREATE暫存表,再於EXEC內使用INSERT INTO
IF (select OBJECT_ID('tempdb..#TTmp')) IS NOT NULL DROP TABLE #TTmp
CREATE TABLE #TTmp (ProdNo varchar(16))
EXEC('INSERT INTO #TTmp select ProdNo from Prod')

2.WHERE IN篩選值不可以變數存放,如@Tmp = '1,2,3',查詢資料集合不為1,2,3之結果 (解決方法)

2012-02-03

T-SQL WHERE IN 變數 有多筆值查無資料錯誤

在撰寫Stored Procedure時,發現在where條件中若以宣告的變數篩選資料,
當變數為多筆值並搭配WHERE IN的時候會發生查詢不到資料的情況
DECLARE @xTmp VarCHAR(100)

SET @xTmp = 'A01,B01,B99'

select GPNa,DTNo,DTNa
from NOM
where GPNo='SO'
and DTNo in (@xTmp)

GPNa       DTNo           DTNa
---------- -------------- ----------------

(0 個資料列受到影響)
此時需自行新增一個切割字串放入暫存Table的Function來解決此問題
USE [DATABASENAME]

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[FN_SplitStr]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[FN_SplitStr]

USE [DATABASENAME]
GO

CREATE FUNCTION [dbo].[FN_SplitStr](@xStr NVarchar(MAX),@xFStr varchar(1))
                RETURNS @TmpTable TABLE ( TmpStr NVarchar(MAX))
AS
BEGIN
    --@xStr 欲切割字串
    --@xFStr 切割用判定字元
    --@TmpTable 存放切割後資料

    DECLARE @xTmpStr NVarchar(MAX)--暫存字串

    SET @xStr = @xStr + @xFStr--分割字串最後加上一個分割字元
    SET @xTmpStr = ''--清空暫存字串
    WHILE CHARINDEX(@xFStr,@xStr)>0--判斷是否有分割字元存在
    BEGIN
        --SET @xTmpStr = @xTmpStr + SUBSTRING(@xStr,1,CHARINDEX(@xFStr,@xStr)-1)
        SET @xTmpStr = SUBSTRING(@xStr,1,CHARINDEX(@xFStr,@xStr)-1)
        IF Replace(@xTmpStr,' ','') <> ''--不為空值才寫入@TmpTable
            INSERT INTO @TmpTable (TmpStr) values (@xTmpStr)        SET @xStr = SUBSTRING(@xStr,CHARINDEX(@xFStr,@xStr)+1,LEN(@xStr))
    END

    RETURN
END
DECLARE @xTmp VarCHAR(100)
SET @xTmp = 'A01,B01,B99'

select GPNa,DTNo,DTNa
from NOM
where GPNo='SO'
and DTNo in (select * from dbo.FN_SplitStr(@xTmp,','))

GPNa       DTNo           DTNa
---------- -------------- ----------------
成品出入庫類別    A01     生產入庫
成品出入庫類別    B01     銷貨出庫
成品出入庫類別    B99     其他出庫

(3 個資料列受到影響)

參考自
[TSQL]Procdure 或 SqlParameter 來下SQL指令 Where In 多個值的變數解決方法
在T-SQL進行字串分割

2012-02-02

[分享]記帳小管家-免傳輸線更新PC與Android帳本資料

首先還是要感謝慕雲大提供帳務小管家這麼好用的軟體,
電腦版的記帳作了兩年多了,昨天開始連Android也一併授權了,
在這邊提供自己目前使用的配套同步方式,可以省略傳輸線的動作!

必要條件:

1.這麼讚的軟體,請先贊助
2.申請Dropbox帳號並於電腦端安裝程式
   電腦玩物-Dropbox 雲端資料同步軟體能用來幹嘛?10個我最常被滿足需求
3.手機安裝 Dropsync-設定手機自動同步資料夾

想法:
利用Dropsync來自動同步dropbox內的檔案(目前Dropbox官方Android版程式無此功能),
等於在每個有安裝dropbox的Client都有一份Android帳務的資料庫檔案,
我們在PC帳務小管家就可以很方便的指定我們剛剛設定存放資料庫的資料夾,
進行同步,而不用使用到傳輸線,同步完成後,當手機Dropsync下次自動執行同步時,
就會將同步後的資料庫檔案更新到手機內,這樣是不是方便很多呢?

2012-01-29

Win7 取消工作列最近開啟程式檔案清單

在Win7中,在工作列程式會顯示最近開啟過的檔案列表,
若不想要此功能的話,可透過下列步驟關閉。
1.於工作列上滑鼠右鍵-->內容
2.切換至 [開始]功能表
3.將 儲存最近開啟的項目並顯示於[開始]功能表和工作列 取消

2012-01-28

MS SQL-字串函數-CHARINDEX

利用CHARINDEX函數,可抓取字串中指定字串的起始位置,
以方便程式進行字串的相關處理動作。
CHARINDEX('BCD','abcde')--不分大小寫
-----------
2
CHARINDEX('BCD','abcde' COLLATE Latin1_General_CS_AS)--分大小寫
-----------
0

參考自:MSDN-CHARINDEX

2012-01-20

MS SQL 字串函數-QUOTENAME-字串加上雙引號

利用MS SQL的QUOTENAME函數,
可以方便的將字串以引號包起來,
避免因為一堆引號降低程式碼可讀性,
及降低出錯機會。

select QUOTENAME('String','''')
--------------------------------------------------------- 
'String'

(1 個資料列受到影響)

參考自:QUOTENAME

2012-01-19

T-SQL 特殊字碼表

Enter ---char(13)
換行-----char(10)
Tab------char(9)
單引號--char(39)
雙引號--char(34)

2012-01-18

MS SQL 建立暫存表格 temp table

在MS SQL中建立暫存表方法有兩種,
1.在tempdb中建立
   I.區域-前置詞#-其他連線不可查詢此TABLE
   II.全域-前置詞##-其他連線可查詢此TABLE
   連線中斷後被清除
Create Table #NOM_tmp (
    GPNo varchar(3),                        
    DTNo Nvarchar(10),
    GPNa Nvarchar(10),
    DTNa Nvarchar(20))
2.在記憶體宣告建立
   批次作業結束後清除
DECLARE @NOM_tmp TABLE (
    GPNo varchar(3),                        
    DTNo Nvarchar(10),
    GPNa Nvarchar(10),
    DTNa Nvarchar(20))
參考自
MSDN-CREATE TABLE
建立#TempTable與Declare @TempTable有何差別

MS SQL Procedure 多個回傳值

上一篇 MS SQL 資料處理時多個回傳值 ,
再延伸到編寫Stored Procedure時,遇到需要多個回傳值的處理方式!
--範例如下
CREATE PROCEDURE [dbo].[SP_TEST]
    (@xGPNo varchar(2),@xDTNo varchar(3),@xRGPNa Nvarchar(20) OUTPUT,@xRDTNa Nvarchar(50) OUTPUT)--設定傳入值格式
AS
BEGIN
    DECLARE @xSQL Nvarchar(MAX)--存放動態語法
    DECLARE @xGPNa Nvarchar(20)--接收回傳值
    DECLARE @xDTNa Nvarchar(50)--接收回傳值
    DECLARE @xStatemen nvarChar(MAX)--sp_executesql 參數

    --參數設定順序需與語法一致
    SET @xStatemen = '@xGPNa Nvarchar(20) OUT,@xDTNa Nvarchar(50) OUT,@xGPNo varchar(2),@xDTNo varchar(3)'
    --查詢語法
    SET @xSQL = 'select @xGPNa=GPNa,@xDTNa=DTNa '+
                ' from NOM '+
                ' where GPNo='+Quotename(@xGPNo,'''')+
                ' and DTNo='+Quotename(@xDTNo,'''')

    --語法、參數、回傳值及相關變數
    EXEC sp_executesql @xSQL,@xStatemen,@xGPNa OUT,@xDTNa OUT,@xGPNo,@xDTNo
    SET @xRGPNa=@xGPNa
    SET @xRDTNa=@xDTNa
END
--執行
DECLARE @xRGPNa Nvarchar(20)
DECLARE @xRDTNa Nvarchar(50)
EXEC dbo.SP_TEST 'SO','B01',@xRGPNa OUTPUT,@xRDTNa OUTPUT
select @xRGPNa+'-'+@xRDTNa
-----------------------------------------------------------------------
成品出入庫類別-銷貨出庫

(1 個資料列受到影響)
參考自:
MSDN-CREATE PROCEDURE
walter 心得筆記-[SQL Server] 如何接收 Store Procedure 的傳回值