DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SQL Server 2005 CLR VB2005 DBアクセス方法

環境/言語:[VB.NET2005]
分類:[.NET]

SQL Server 2005 CLR ですが VB2005でOleDbConnection.Openできないのですが、、、

VB2005のWinAppから呼び出すとちゃんとOPENするのですが、
SQL Server 2005 から呼び出すとOPENでこけます。

ソースは以下です
----
Imports System.Data.OleDb


connStr = "Provider=SQLOLEDB.1;Password=xxxxxxx;Persist Security
Info=True;User ID=sa;Initial Catalog=tbl_1;Data Source=SV01"

m_conn = New OleDbConnection(connStr)
m_conn.Open()
----
System.Data.OleDb が使えないのでしょうか?

OS:WinXPSP2
VS2005Developer
2007/01/17(Wed) 10:15:45 編集(投稿者)

この投稿はマルチポストです。

●マルチポストされている場所
http://bbs.wankuma.com/index.cgi?mode=al2&namber=113
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36088&forum=26
----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
> SQL Server 2005 から呼び出すとOPENでこけます。

どんな例外が出てますか?

SQL CLR で別マシンで稼動している SQL Server に接続しようとしてますか?

とすると、SQL CLR を動かしている SQL Server の実行アカウントによっては、ネットワーク資源にアクセスできなかったりするはずですが、その辺はチェックしてますか?
■No18801に返信(渋木宏明(ひどり)さんの記事)
>>SQL Server 2005 から呼び出すとOPENでこけます。
>
> どんな例外が出てますか?

Partial Public Class SQLCLR
<SqlFunction()> _
Public Shared Function HelloSqlClr() As SqlString

connStr = "Provider=SQLOLEDB.1;Password=xxxxxx;Persist Security Info=True;User ID=sa;Initial Catalog=tbl_1;Data Source=xxxxx"
m_conn = New OleDbConnection(connStr)
m_da = New OleDbDataAdapter
Try
m_conn.Open()

ここでCatchに入りますが、エラー内容は不明です
Catchの中で
Return New SqlString("Err 1")

としているだけなので(.Netど素人なのでエラー内容の取得方法が・・・)

> SQL CLR で別マシンで稼動している SQL Server に接続しようとしてますか?
ローカルDBです

> とすると、SQL CLR を動かしている SQL Server の実行アカウントによっては、ネットワーク資源にアクセスできなかったりするはずですが、その辺はチェックしてますか?

別プロジェクトで
Imports SQLCLR
SQLCLR.HelloSqlClr()
とすると、ちゃんとOPENできるので問題ないはずです。
この投稿はマルチポストです。

●マルチポストされている場所
http://hanatyan.sakura.ne.jp/bbs/wforum.cgi?no=4824&reno=no&oya=4824&mode=msgview&page=0

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
一応

http://www.atmarkit.co.jp/fdb/rensai/sqls05try05/sqls05try05_1.html
で、OPENはできるようになりました。
あと、SqlDataReader の値を吸い出して、ファイルに書き出すのですが
Dim sw As New StreamWriter("C:\sql\Test.txt", False, System.Text.Encoding.GetEncoding("Shift_Jis"))
で、セキュリティエラー(permissionがどうやらこうやら)が出て、
どうしていいかわかりません。C:\sqlフォルダーのセキュリティをどうにかしないと
いけないみたいですが、そこで行き詰ってます。
どうすればいいでしょうか?。
> http://www.atmarkit.co.jp/fdb/rensai/sqls05try05/sqls05try05_1.html
> で、OPENはできるようになりました。

て、まさか

>SqlConnection conn = new SqlConnection("context connection=true");

が分かってなかったってことですか???

> どうしていいかわかりません。C:\sqlフォルダーのセキュリティをどうにかしないと
> いけないみたいですが、そこで行き詰ってます。
> どうすればいいでしょうか?。

前述のネットワーク資源云々と同じです、SQL Server の実行アカウントに、C:\sql フォルダへの書き込みを許可してください。

Windows 2000 や Windows Server 2003 なら、フォルダのプロパティの「セキュリティ」ページで設定します。

XP だと、簡易共有を切らないと「セキュリティ」ページが表示されなかったような気がします。
■No18819に返信(渋木宏明(ひどり)さんの記事)

> >SqlConnection conn = new SqlConnection("context connection=true");
>
> が分かってなかったってことですか???

BINGO!です.NET始めて5日しか経ってませんし・・・・

> 前述のネットワーク資源云々と同じです、SQL Server の実行アカウントに、C:\sql フォルダへの書き込みを許可してください。

タスクマネージャーの「sqlservr.exe」では「SYSTEM」となってますが、
その権限はC:\sql フォルダにありますよ。
ちなみにSQL server (MSSQLSERVER)のサービスのログオンを自分のユーザー名
に変えても駄目でした。

違う設定があるのでしょうか?
> タスクマネージャーの「sqlservr.exe」では「SYSTEM」となってますが、

"SYSTEM" は総称なので、「SQL Server 構成マネージャ」で正確なアカウント名を確認してください。

> ちなみにSQL server (MSSQLSERVER)のサービスのログオンを自分のユーザー名
> に変えても駄目でした。

それは変ですね?
「設定を変更しただけ」で SQL Server の再起動をしなかったとか、ですか?
■No18833に返信(渋木宏明(ひどり)さんの記事)
>>タスクマネージャーの「sqlservr.exe」では「SYSTEM」となってますが、
>
> "SYSTEM" は総称なので、「SQL Server 構成マネージャ」で正確なアカウント名を確認してください。

LocalSystem という名前でした、が、フォルダーのセキュリティには
LocalSystemというユーザーがないです、LOCAL SERVICE というのはありましたが。

>>ちなみにSQL server (MSSQLSERVER)のサービスのログオンを自分のユーザー名
>>に変えても駄目でした。
>
> それは変ですね?
> 「設定を変更しただけ」で SQL Server の再起動をしなかったとか、ですか?

いや、それはないです。Taskmgrでユーザー名を確認しましたから。
> LocalSystem という名前でした、が、フォルダーのセキュリティには
> LocalSystemというユーザーがないです、LOCAL SERVICE というのはありましたが。

Service か Local Service が LocalSystem だったと思います。
でも、よく考えるとこいつらは SYSTEM グループの一員だったような。。。

試しに、EveryOne に書きこみ権を与えるとどうなるでしょうか?
> 前述のネットワーク資源云々と同じです、SQL Server の実行アカウントに、C:\sql フォルダへの書き込みを許可してください。

↑SQL Server の認証モードによりますね。

Windows 認証を使っている場合、そのアカウントでファイルアクセスが行われたような気がします。

DB認証の時は最初に指摘したとおり、SQL Server の実行アカウントになるのではないかと。
VBの設定がわかりました、「アクセス許可のレベル」を「外部」か「アンセーフ」
にすればファイル操作できるみたいです。ただし、SQLサーバー側の設定を
1)データベース所有者 (DBO) に UNSAFE ASSEMBLY 権限がある
2)TRUSTWORTHY データベース プロパティが有効
でないと駄目みたいです。

SQLServerManagementStudioで「UNSAFE ASSEMBLY」という語は見当たったのですが
「TRUSTWORTHY データベース プロパティ」とういうのがどこを見ても出てきません。ご存知ありませんでしょうか?
途中経過報告です

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36088&forum=26&start=8
既にマルチポスト先で解決した模様です。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36088&forum=26&start=8

後にフィードバックするとは言っているようですが、解決宣言を全ての場所でしていないので忘れられている可能性ありです。
ご報告までに。
VBレスキュー花ちゃんのところにもいたのですが、
(報告)さんという人が現れるのですが、管理人さんですか?匿名投稿ですか?
ちなみにVBレスキュー花ちゃんのところに書き込みできません、
「★アダルトサイトの投稿防止対策を行っております。」
と、怒られます。どうなっているのでしょうか?

------
では、簡単ではありますがレポートです。
■SQL CLR の作成方法
http://www.atmarkit.co.jp/fdb/rensai/sqls05try05/sqls05try05_1.html
■SQL CLRでの外部リソースへのアクセス方法
http://www.atmarkit.co.jp/fdb/rensai/sqls05try06/sqls05try06_2.html
・データベースの「TRUSTWORTHY」データベース・プロパティをONにする方法
ALTER DATABASE tablename SET TRUSTWORTHY ON
2007/01/23(Tue) 13:00:51 編集(投稿者)

>ちなみにVBレスキュー花ちゃんのところに書き込みできません、
>「★アダルトサイトの投稿防止対策を行っております。」
>と、怒られます。どうなっているのでしょうか?

>投稿される場合必ず [はじめにお読み下さい] をご覧下さい。
とあるのに読まれていないのでしょうか?
http://hanatyan.sakura.ne.jp/hazimeni.htm#keijiban

>http:// から始まるURLを投稿された場合。(ご面倒でも最初の h を除いた ttp://
>のように入力して投稿して下さい。リンクはそれで設定できるようになっています)
と明記されていますよ。

公共の場を使わせてもらっている以上、ルールは守るべきです。
2007/01/24(Wed) 04:35:20 編集(投稿者)

■No18889に返信(ろーちゃんさんの記事)
> VBレスキュー花ちゃんのところにもいたのですが、
> (報告)さんという人が現れるのですが、管理人さんですか?匿名投稿ですか?

他の掲示板の事は分かりませんが、この掲示板では、マルチポストを報告していただくときに匿名の意味で(報告)となります。

また、他の掲示板の使い方に関して、この掲示板でご質問されることはご遠慮ください。

ろーちゃんさんの今までのご投稿を拝見しますと、「書き込みのマナーについて」をお読みいただき、同意していただいたと判断できる記述が見つかりません。マルチポスト先のご報告はすべて別の方からされています。このまま「書き込みのマナーについて」のルールを無視し続けますと、悪質な投稿者として、しかるべき処置をとらざるを得なくなることをご了承ください。

DOBON.NET | プログラミング道 | プログラミング掲示板