- PR -

ASP初心者、簡単なDB接続でエラー

投稿者投稿内容
GOLF@スポコン
常連さん
会議室デビュー日: 2003/11/26
投稿数: 30
投稿日時: 2004-01-27 12:05
はじめまして。
このたびASPを勉強しようと思い簡単なDB接続のWEBアプリを作成しようと
思っています。

早速ですが私の環境を下記に記載しておきます。
◆サーバ
・Windows2000Server SP4
・IIS 5.0
・SQL Server 7.0

◆クライアント
・WindowsXP SP1
・IE 6.0

です。

やりたいことは、サーバに「syain_tbl」がありますので、
それを全件表示したいだけです。

ASPソース
-----------------------------------------------------------------------
<%
Response.Expires=0
Response.AddHeader "Pragma","No-Cache"
Response.AddHeader "Cache-Control","No-Cache"
Response.Buffer = "True"
Response.Clear
%>

<html>
<head>
<title>sample</title>
</head>
<body>
<%
''データベースOPENファンクション
Datasource = "syain"
User = "yama"
Password = "act"

'<!---------- データベースOPEN ---------->
set db = Server.CreateObject("ADODB.Connection")
db.ConnectionTimeout = 600
db.CommandTimeout = 600
db.Open Datasource,User,Password

sql = "SELECT * FROM syain_tbl"

'Recordsetオブジェクトを作成
Set RS = Server.CreateObject("ADODB.Recordset")

'SQL文実行
RS.Open sql, db, 3, 3

%>
<table border="1">
<H1>社員テーブル</H1>
<tr>
<th>NO</th><th>名前</th>
</tr>
<%
Do While Not RS.EOF
Response.Write ("<tr>")
Response.Write ("<td>"& RS.Fields("syain_no") &"</td>")
Response.Write ("<td>"& RS.Fields("syain_name") &"</td>")
Response.Write ("</tr>")
RS.MoveNext
Loop
Response.End

'データベースを閉じます。
RS.Close
db.Close
Set RS = Nothing
Set db = Nothing
%>
</table>
</body>
</html>
-----------------------------------------------------------------------

上記のソースの場合正しく表示されるのですが、
下記のソースに変更した場合、エラーになります。

◆index.asp -----------------------------------------------------------
<%
Response.Expires=0
Response.AddHeader "Pragma","No-Cache"
Response.AddHeader "Cache-Control","No-Cache"
Response.Buffer = "True"
Response.Clear
%>

<!--#include file = "./sDBConnect.asp"-->

<html>
<head>
<title>sample</title>
</head>
<body>
<%
''データベースOPENファンクション
sDBConnect()

sql = "SELECT * FROM syain_tbl"

'Recordsetオブジェクトを作成
Set RS = Server.CreateObject("ADODB.Recordset")

'SQL文実行
RS.Open sql, db, 3, 3

%>
<table border="1">
<H1>社員テーブル</H1>
<tr>
<th>NO</th><th>名前</th>
</tr>
<%
Do While Not RS.EOF
Response.Write ("<tr>")
Response.Write ("<td>"& RS.Fields("syain_no") &"</td>")
Response.Write ("<td>"& RS.Fields("syain_name") &"</td>")
Response.Write ("</tr>")
RS.MoveNext
Loop
Response.End

'データベースを閉じます。
RS.Close
db.Close
Set RS = Nothing
Set db = Nothing
%>
</table>
</body>
</html>
-----------------------------------------------------------------------

◆sDBConnect.asp ----------------------------------------------------
<SCRIPT language=VBScript runat=Server>
'
' Function sDBConnect()
'
'---------------------------------------------------------------------
' 機能:DBコネクションの確立
'---------------------------------------------------------------------
' 戻値:なし
' 引数:なし
'---------------------------------------------------------------------

Sub sDBConnect()

'------------- 変数定義 ------------------
Datasource = "syain"
User = "yama"
Password = "act"

'---------- データベースOPEN ----------
Set db = Server.CreateObject("ADODB.Connection")
db.ConnectionTimeout = 600
db.CommandTimeout = 600
db.Open Datasource,User,Password

End Sub

</SCRIPT>
-----------------------------------------------------------------------

上記の場合のエラー内容が、
●エラー タイプ
 ADODB.Recordset (0x800A0BB9)
 引数が間違った型、または許容範囲外であるか、競合しています。
 /asp/index2.asp, line 38

理由がわかりません。

なんでも良いのでご指摘よろしくおねがいします。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-01-27 13:00
るぱんです。

コネクションを関数にはじき出したらエラーが出たと言う事でいいですか?
コネクションはADODBのインスタンスとは無縁の物でしたっけ?

レコードセットとコネクションが独立してしまうからではないかと考えてしまうのですが?
GOLF@スポコン
常連さん
会議室デビュー日: 2003/11/26
投稿数: 30
投稿日時: 2004-01-27 13:07
DBコネクションの所を共通関数として使用したいのです。
で、
DBコネクションのプロシージャを初めにインクルードして
使用しようとしていますが、
そうすると、エラーになり、どうにもいかないんです。。。

ASPは初めてでよく理解していません。
その点は了承よろしくお願いします
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-01-27 13:11
コネクションを関数化するのは良いのですが、
引数無し、戻り値無しです。

呼び出し側がどのコネクションか特定できていません。
関数に戻り値作って、呼び出し側で変数に突っ込みなおしてください。
GOLF@スポコン
常連さん
会議室デビュー日: 2003/11/26
投稿数: 30
投稿日時: 2004-01-27 13:21
引用:

るぱんさんの書き込み (2004-01-27 13:11) より:
コネクションを関数化するのは良いのですが、
引数無し、戻り値無しです。

呼び出し側がどのコネクションか特定できていません。
関数に戻り値作って、呼び出し側で変数に突っ込みなおしてください。



ご指摘ありがとうございます。

>引数無し、戻り値無しです。
これではダメってことですよね。。

>関数に戻り値作って、
戻り値は、falese、trueでも良いのでしょうか?

>呼び出し側で変数に突っ込みなおしてください。
何を突っ込みなおせば良いのでしょうか?
関数内で作成したオブジェクトを呼出側の変数に突っ込めばよいのでしょうか?

よろしくお願います。


GOLF@スポコン
常連さん
会議室デビュー日: 2003/11/26
投稿数: 30
投稿日時: 2004-01-27 13:29
すみません。

共通関数がややこしく書いていたみたいで申し訳ございません。
下記の様になります。

◆sDBConnect.asp ----------------------------------------------------

<SCRIPT language=VBScript runat=Server>

Sub sDBConnect()

   '------------- 変数定義 ------------------
   Datasource = "syain"
   User = "yama"
   Password = "act"

   '---------- データベースOPEN ----------
   Set db = Server.CreateObject("ADODB.Connection")
   db.ConnectionTimeout = 600
   db.CommandTimeout = 600
   db.Open Datasource,User,Password

End Sub

</SCRIPT>
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-01-27 13:58
るぱんです。

えとですね、、、
内容を理解してくださいね。

こんなんでどうでしょう?

コード:

呼び出し元
Set db = sDBConnect(db)


Function sDBConnect(db)
   '------------- 変数定義 ------------------
   Datasource = "syain"
   User = "yama"
   Password = "act"

   '---------- データベースOPEN ----------
   Set db = Server.CreateObject("ADODB.Connection")
   db.ConnectionTimeout = 600
   db.CommandTimeout = 600
   db.Open Datasource,User,Password
   sDBConnect = db
End Function




[ メッセージ編集済み 編集者: るぱん 編集日時 2004-01-27 13:59 ]
GOLF@スポコン
常連さん
会議室デビュー日: 2003/11/26
投稿数: 30
投稿日時: 2004-01-27 14:34
引用:

るぱんさんの書き込み (2004-01-27 13:58) より:
るぱんです。

えとですね、、、
内容を理解してくださいね。

こんなんでどうでしょう?

コード:
呼び出し元
Set db = sDBConnect(db) 


Function sDBConnect(db) 
   '------------- 変数定義 ------------------ 
   Datasource = "syain" 
   User = "yama" 
   Password = "act" 

   '---------- データベースOPEN ---------- 
   Set db = Server.CreateObject("ADODB.Connection") 
   db.ConnectionTimeout = 600 
   db.CommandTimeout = 600 
   db.Open Datasource,User,Password 
   sDBConnect = db
End Function




[ メッセージ編集済み 編集者: るぱん 編集日時 2004-01-27 13:59 ]




ありがとうございます。

まず、呼出元の
>呼び出し元
>Set db = sDBConnect(db)
ですが、「sDBConnect(db)」の「db」がいまいちよくわかりません。
べつにいらないのではないですか?


Function sDBConnect()
   '------------- 変数定義 ------------------
   Datasource = "syain"
   User = "yama"
   Password = "act"

   '---------- データベースOPEN ----------
   Set db = Server.CreateObject("ADODB.Connection")
   db.ConnectionTimeout = 600
   db.CommandTimeout = 600
   db.Open Datasource,User,Password
   sDBConnect = db
End Function

ではどうでしょう?

実際
るぱんさんのとおりやってもダメですし、
僕の考えた方でもだめでした。。
サーバの環境がわるいのですかね?

スキルアップ/キャリアアップ(JOB@IT)