2

これはおそらく初心者の質問ですが、レコードセットを文字列変数に設定するにはどうすればよいですか?

これが私のコードです:

Function getOffice (strname, uname) 

strEmail = uname
WScript.Echo "email: " & strEmail 
Dim objRoot : Set objRoot = GetObject("LDAP://RootDSE")
Dim objDomain : Set objDomain = GetObject("LDAP://" & objRoot.Get("defaultNamingContext"))
Dim cn : Set cn = CreateObject("ADODB.Connection")
Dim cmd : Set cmd = CreateObject("ADODB.Command")
cn.Provider = "ADsDSOObject"
cn.Open "Active Directory Provider"
Set cmd.ActiveConnection = cn

cmd.CommandText = "SELECT physicalDeliveryOfficeName FROM '" & objDomain.ADsPath & "' WHERE mail='" & strEmail & "'"
cmd.Properties("Page Size") = 1
cmd.Properties("Timeout") = 300
cmd.Properties("Searchscope") = ADS_SCOPE_SUBTREE

Dim objRS : Set objRS = cmd.Execute

  WScript.Echo objRS.Fields(0)

Set cmd = Nothing
Set cn = Nothing
Set objDomain = Nothing
Set objRoot = Nothing

Dim arStore 

Set getOffice = objRS.Fields(0)

Set objRS = Nothing

End function 

関数を実行しようとすると、「vbscript ランタイム エラー: タイプの不一致」というエラーがスローされます。これは、文字列変数にレコードセット値を設定できないことを意味すると推測します。

この問題を解決するにはどうすればよいですか?


やってみました

If IsNull(objRS.Fields(0).Value) = TRUE then getOFfice = "noAD" else getOFfice = objRS.Fields(0).VALue end if

そして、それは別のエラー ADODB.Field をスローします: BOF または EOF が True であるか、現在のレコードが削除されました。要求された操作には現在のレコードが必要です。

4

7 に答える 7

4

これを試して:


getOffice = objRS.getString

これにより、レコードセット全体がタブ区切りの文字列として返されます。

于 2008-11-26T21:41:00.487 に答える
2

Set はオブジェクトにのみ使用され、文字列などの単純な変数には使用できません。
これを試してください:(レコードセットが空でないことも確認します)


If objRS.RecordCount <> 0 Then
  getOffice = CStr(objRS.Fields(0))
Else
  getOffice = ""
End If
于 2008-11-24T19:30:46.803 に答える
0

「On Error Resume Next」を一番上に追加したところ、nullエラーがスキップされました。

ただし、vbscript で NULL 値を処理する簡単な方法があればいいのにと思います。

ご助力いただきありがとうございます

于 2008-11-20T00:07:30.243 に答える
0

DB 呼び出しからデータを返すさまざまな方法は、多くの場合、データへのアクセスに使用されるメソッド/ドライバー (ODBC、ADO、ADO.NET、ODP.NET、OleDB など) に大きく依存することが私の経験です。 ToString()、GetString()、キャスト、またはその変形が必要です。

于 2008-11-19T23:18:01.310 に答える
0

レコードセットが空ではありませんか? 通常、何かを開始する前に、最初に確認する必要があります。それが何をする必要があるかについて他に何も知らないので、私は次のようなことを提案するかもしれません:

Function getOffice (strname, uname) 

strEmail = uname
WScript.Echo "email: " & strEmail 
Dim objRoot : Set objRoot = GetObject("LDAP://RootDSE")
Dim objDomain : Set objDomain = GetObject("LDAP://" & objRoot.Get("defaultNamingContext"))
Dim cn : Set cn = CreateObject("ADODB.Connection")
Dim cmd : Set cmd = CreateObject("ADODB.Command")
cn.Provider = "ADsDSOObject"
cn.Open "Active Directory Provider"
Set cmd.ActiveConnection = cn

cmd.CommandText = "SELECT physicalDeliveryOfficeName FROM '" & objDomain.ADsPath & "' WHERE mail='" & strEmail & "'"
cmd.Properties("Page Size") = 1
cmd.Properties("Timeout") = 300
cmd.Properties("Searchscope") = ADS_SCOPE_SUBTREE

Dim objRS : Set objRS = cmd.Execute

If Not objRS.BOF Then objRS.Move First
If Not objRS.EOF Then 
  If Not IsNull(objRS.Fields(0)) and objRS.Fields(0) <> "" Then  WScript.Echo cStr(objRS.Fields(0))
End If

Set cmd = Nothing
Set cn = Nothing
Set objDomain = Nothing
Set objRoot = Nothing

Dim arStore 

Set getOffice = objRS.Fields(0)

Set objRS = Nothing

End function

明らかに、空のレコードセットをチェックしたり、null をチェックしたりする方法はたくさんあります。

于 2008-11-23T15:49:11.013 に答える
0
Cstr(objRS.Fields(0))
于 2008-11-19T23:11:43.583 に答える
0

これを変更してみてください:

getOffice = objRS.Fields(0) を設定します。

これに:

getOffice = objRS.Fields(0)

于 2008-11-19T23:12:19.370 に答える