1

StartDateMicrosoft SQL データベースからデータを抽出して、2 日からまでの顧客レポートを作成するシートを作成しましたEndDate

私はいくつかのことで遊んでいますが、とにかく成功していません。私は検索しましたが、私が求めていたものや理解できるものを見つけることができませんでした.

私が信じている問題は、Excel で使用している日付のデータ型であり、それを SQL クエリに渡そうとしています。これを可能にして正しくするには、何らかの方法でこれを変換する必要があることを理解しています。

クエリに日付を手動で入力すると、問題なく動作します。しかし、顧客の使用には実用的ではありません。私はこれを経験していません。それを通して私の方法を突き刺します。誰かがこれで私にとても親切にしてくれたなら、とても感謝しています.

以下は私が使用しようとしているコードです

Sub DataExtract()
'
DataExtract Macro
'

' Create a connection object.
 Dim cni96X As ADODB.Connection
 Set cni96X = New ADODB.Connection

' Set Database  Range

' Provide the connection string.
Dim strConn As String
Dim Lan As Integer
Dim OS As Integer
Dim PointID As String


' Set Variables
Lan = Range("Lan").Value
OS = Range("OS").Value
PointID = Range("PointID").Value
StartDate = Range("StartDate").Value
EndDate = Range("EndDate").Value


'Use the SQL Server OLE DB Provider.
 strConn = "PROVIDER=SQLOLEDB;"

'Connect to 963 database on the local server.
strConn = strConn & "DATA SOURCE=(local);INITIAL CATALOG=i96X;"

'Use an integrated login.
strConn = strConn & " INTEGRATED SECURITY=sspi;"

 'Now open the connection.
cni96X.Open strConn

' Create a recordset object.
Dim rsi96X As ADODB.Recordset
Dim rsi96X1 As ADODB.Recordset
Set rsi96X = New ADODB.Recordset
Set rsi96X1 = New ADODB.Recordset

With rsi96X
    ' Assign the Connection object.
     .ActiveConnection = cni96X
    ' Extract the required records1.
    .Open "SELECT ModuleLabel, originalAlarmTime FROM LastAlarmDetailsByTime WHERE (os = " & OS & " And theModule = N'" & PointID & "'AND AlarmCode = N'DI=1' And lan = " & Lan & " And originalAlarmTime BETWEEN N'" & StartDate & "' AND N'" & EndDate & "') ORDER BY originalAlarmTime DESC"
    ' Copy the records into sheet.
    Range("PointLabel, TimeCallInitiated").CopyFromRecordset rsi96X


With rsi96X1
    .ActiveConnection = cni96X
    ' Assign the Connection object.
    .Open "SELECT originalAlarmTime FROM LastAlarmDetailsByTime WHERE (os = " & OS & " And theModule = N'" & PointID & "'AND AlarmCode = N'CDI1' And lan = " & Lan & " And originalAlarmTime BETWEEN N'" & StartDate & "' AND N'" & EndDate & "')ORDER BY originalAlarmTime DESC"
     ' Copy the records into sheet.
    Sheet1.Range("TimeCallEnded").CopyFromRecordset rsi96X1
    ' Tidy up
    .Close

これが理にかなっていることを願っています。

4

2 に答える 2

3

データ型を指定することはできません。Access データベース エンジン (以前の Jet) が推測する必要があります。特定のレジストリ設定 (例: MaxScanRows) を変更IMEX=1し、接続文字列に含めることで、推測に影響を与えることができます。詳細については、このナレッジ ベースの記事を参照してください。


これは私が何年も前にこの件について書いたものです(「ONEDAYWHEN = 0」をグーグルで検索すると、十分に注意を払っていないかもしれませんが、広く読まれていることがわかります!):

関連するレジストリ キー (Jet 4.0 用) は次の場所にあります。

Hkey_Local_Machine/ソフトウェア/マイクロソフト/ジェット/4.0/エンジン/Excel/

レジストリ キーは常に読み取られImportMixedTypesます (それが受け入れられるかどうかは後で説明します)。これをテストするには、キーを変更し ImportMixedTypes=OneDayWhenて ISAM を使用しようとします。「Windows レジストリのエンジン セクションの Excel キーの設定が無効です」というエラーが表示されます。有効な値は次のとおりです。

  • ImportMixedTypes=Text
  • ImportMixedTypes=Majority Type

データ型は列ごとに決定されます。「多数タイプ」とは、各列の一定数の行 (これについては後で詳しく説明します) がスキャンされ、データ型がカウントされることを意味します。セルの値と形式の両方を使用して、データ型を決定します。大多数のデータ型 (つまり、最も行数の多いデータ型) によって、列全体の全体的なデータ型が決まります。同点の場合は数値を優先する傾向があります。マジョリティ データ型としてキャストできないマイノリティ データ型の行は、null 値で返されます。

の場合ImportMixedTypes=Text、列全体のデータ型は次のようになります。

Jet (MS Access UI): 'Text' data type 
DDL: VARCHAR(255) 
ADO: adWChar ('a null-terminated Unicode character string') 

これは次のものとは異なることに注意してください。

Jet (MS Access UI): 'Memo' data type 
DDL: MEMO 
ADO: adLongVarWChar ('a long null-terminated Unicode string value') 

ImportMixedTypes=TextMemoは としてキャストされるため、テキストを 255 文字に短縮しますText。列が として認識されるMemoには、マジョリティ タイプが検出される必要があります。つまり、検出される行の大部分に 256 文字以上が含まれている必要があります。

しかし、混合および/または過半数タイプが何であるかが決定される前に、各列に対して何行がスキャンされますか? 2 番目のレジストリ キー がありますTypeGuessRows。0 から 16 (10 進数) の値を指定できます。1 から 16 までの値は、スキャンする行数です。ゼロの値は、すべての行がスキャンされることを意味します。

最後のねじれが 1 つあります。IMEX=1接続文字列の拡張プロパティの設定によって、ImportMixedTypes 値が受け入れられるかどうかが決まります。IMEX「IMport EXport モード」を指します。可能な値は 3 つあります。IMEX=0無視さIMEX=2ImportMixedTypes、「Majority Types」のデフォルト値が使用されます。確実に尊重さIMEX=1れる唯一の方法です。ImportMixedTypes=Text結果の接続文字列は次のようになります。

Provider=Microsoft.Jet.OLEDB.4.0; 
Data Source=C:\ db.xls; 
Extended Properties='Excel 8.0;HDR=Yes;IMEX=1' 

MAXSCANROWS 最後に、接続文字列の拡張プロパティで使用して TypeGuessRows レジストリ キーをオーバーライドできることは、MSDN の記事で言及されていますが、これは誤りのようです。このように使用MAXSCANROWS=0すると、どのような状況でも何も起こりません。別の言い方を ONEDAYWHEN=0すれば、拡張プロパティを配置するのとまったく同じ効果があり、何もありません (エラーでさえありません!) 同じImportMixedTypesことが ie にも適用され、レジストリ設定を上書きするために接続文字列で使用することはできません。

要約するTypeGuessRowsと、Jet に「混合タイプ」の状況が存在するかどうかを検出させるために使用するか、Jet を「だまして」特定のデータ タイプを過半数のタイプとして検出させるために使用します。「混合タイプ」の状況が検出された場合、ImportMixedTypesJet に過半数のタイプを使用するか、すべての値をText (最大 255 文字) として強制するように指示するために使用します。

于 2012-04-11T08:34:52.147 に答える
0

SQL ステートメントの日付部分を次のように変更してみてください。

"[...] originalAlarmTime BETWEEN '" & Format$(StartDate, "yyyy-mm-dd") & "' AND '" & Format$(EndDate, "yyyy-mm-dd") & "' [...]"

パラメータ化されたクエリを使用することもできます。

于 2012-04-11T07:13:32.670 に答える