ADO.NETの質問・雑談スレ2
ADO.NETに関する質問・雑談・評価 etc 何でもどうぞ。 前スレ ADO.NETの質問・雑談スレ http://pc11.2ch.net/test/read.cgi/db/1104630889/ >>269 ロックにもいろいろある 楽観的ロックで検索してみろ オレは何時でも超楽観的ロック。 つまり、ロックなど一切しないw >>269 まず対象のDBMSを特定しないと確実な話はできないんだが 1文のSQLは、その1文だけのトランザクションだと考えていい テーブルロックをかける必要があるかどうかは、SQLが1文かどうかにかかわらない その処理でテーブルロックが必要ならかければいい まあ俺にはSQL1文で明示的にテーブルロックする必要がある処理は思いつかないが 教えてください。 スレ違いだったらすみません。 今度、.net の環境で DB を扱うプログラムを書きます。 基本的にはクライアント側か、クライアントと DB サーバの仲介をする部分を扱うことになります。 DB に関することは教科書レベルでは知っているつもりなのですが、 たとえば効率的な SQL の書き方とか、とにかく実戦レベルで気をつけなければならないことなどは 経験がないためよくわかっていません。 こんな人間が読むのに最適な本をご存知でしたら、紹介をお願いできないでしょうか。 よろしくお願いします。 プログラミングADO.NET 2.0 現場で使えるSQL SqlDataSource の ConnectionString とか SelectCommand をプログラムで動的に 変更することはできるのでしょうか? GridViewにDBを貼り付けて表示させるときに、SqlDataSourceをウィザードで定義 する方法はあるのですが、その設定をプログラムで動的に変更する方法は無いかと 調べているところです。 ご存知の方いましたら教えてください。 >>276 つPage_Load() つか.aspxのソースみれ >>276 >SqlDataSource の ConnectionString とか SelectCommand をプログラムで動的に >変更することはできるのでしょうか? できる。 >GridViewにDBを貼り付けて表示させるときに、SqlDataSourceをウィザードで定義 >する方法はあるのですが、その設定をプログラムで動的に変更する方法は無いかと >調べているところです。 >ご存知の方いましたら教えてください。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.datasource%28VS.80%29.aspx visual studio2008です。 mysqlで、データソース→新しいデータソースの追加→データソースの種類を選択 →データベース→アプリケーションがデータベースへ接続に使用するデータ接続 ここで正確に入れても次のデータオブジェクトの選択で 「選択したデータベースが新しいか、オブジェクトを含んでいません」 になる。 サーバーエクスプローラーのデータ接続では、普通につなげて、中身も見える。 同じように設定しているのだけど、何で差がつくのだろう? 質問する場所違ってたら誘導ください。よろしくお願いいたします。 ちなみに、デザイナで、データセットを編集 を使って、サーバーエクスプローラーのをD&Dすれば普通には使える。 ただ、余計に手間がかかる理由が不明。 DataAdapterでFillしたときに、関連する子テーブルも自動でFillされるんだな。 便利だけど動作が把握し切れん・・・ >>280 GridViewの質問だよ。DataGridViewじゃないよ。 >>283 便利機能のライブラリって、必ずそういう事がつきまとうよな。 で、結局は従来からの面倒だが非常に単純なやり方に落ち着いたりする・・・w Accessのフォームは、非連結フォームに落ち着くよな。 みたいなw DBから、DataTableに読み込んだテーブルがやたらとでかくて、 そのクライアントPCのスペック(メモリ)を超えている場合は、 ADO.NETの範疇でストップをかけることが出来たりするのでしょうか? (DataTableのあるプロパティの値をこうしてたら途中までで自動で 止めるなどの機能はあるのでしょうか) それはVB.NETやOSの範疇だったりするのかな? 途中でストップはないんじゃないの? あらかじめデータが巨大になることが分かっているなら select に where で条件を付けることを必須にするとか、アプリ側の 対処になるような気がする >>288 レスありがとうございます。 テーブルの操作が複雑な場合、サーバやネットワークの負荷を抑える為に、 処理の途中で、一時保存という形でローカルPCにmdbファイルという形で 保存しておいて、それを処理していくというものを作ろうとしたのですが、 その場合、mdbファイルに保存されたテーブルを処理する過程の部分は、 なるべくデータを少なく読み取るように工夫をする事で対処出来ますが、 サーバのテーブルをローカルへコピーする過程の部分で、テーブルが 大きすぎる場合は大丈夫なのかなとか思ったのです。 主キーが無いテーブルの場合は、途中まで読み込んで、クリアして、 また続きからとかの処理は無理ですよね? >>287 俺は使ったこと無いので詳細はわからんが DataAatapterのFillに、 Fill(DataSet, String, IDataReader, Int32, Int32) ってのがある これが開始位置と最大行数指定できるらしい これでなんとかなるんじゃないかな >>290 ありがとうございます。早速詳細を調べてみます。 >>289 その場合だと、DataTableを使わずReaderでループまわして、 直接MDBへ書き込んだ方が効率よくない? >>292 その手がありましたね。ADO.NET使いこなせてなかったので そこまで頭が回っていませんでした。ありがとうございます。 現在VB.NET2005にて データベースの接続及びSQL文発行を行う DLLを作成しており、 接続には『SqlDataReader』を使用しています。 Transactionを指定しない場合に 排他制御がどのように行われているのか、がわかりません。 一切排他が行われないのでしょうか? また、排他制御を実装する場合はどのようにすれば良いのでしょうか? 行いたい制御としては、 @データ取得中(SELECT)にデータ更新を抑止する Aデータ更新中(INSERT/UPDATE/DELETE)にはデータの取得/更新を抑止する です。 >>294 Transactionを明示的に指定しない場合、SQL Serverは自動コミット モードで動作する 自動コミット モードではステートメント単位でトランザクションが自動的に発行される 例) insert insert は概念的には begin tran insert commit tran begin tran insert commit tran と解釈される よって、1つのSQL文の実行中に、まったく同時に他のSQL文を実行したからといって それが行単位である限り、それぞれのSQL文は自動的に発行されたトランザクションで 保護されているため、同時に実行したことが原因でデータを破壊してしまうようなことはない なお、SQL Server のデフォルトの分離レベルはREAD COMMITTEDなので 自動コミットでもREAD COMMITTEDが適用されるはず http://support.microsoft.com/kb/198024/ja http://technet.microsoft.com/ja-jp/library/ms173763.aspx カーソルを使った場合の説明は以下 http://technet.microsoft.com/ja-jp/library/ms190211 (SQL.90).aspx ちなみにトランザクションが必要なのは、複数のSQLの結果をまとめてコミット/ロールバックしたい場合、 複数のINSERT/UPDATEの途中でSELECTされたら困る場合、あるいは性能を意識する場合など その場合の記述方法はデータベースの入門書を読んで勉強してくれ すみません、質問いいですか?環境はVS2008pro C# SQLServer2005EEです。 SQL分でLIKE抽出するときなのですが、%っていうのは「なくても」or「何が何文字あっても」って感じですか? ワイルドカード文字数を指定してLIKE抽出したい場合*を使うのでしょうか? 又、*は「とりあえず何らかの文字が1文字以上ある」なのでしょうか? やりたいことは (0は何らかの数字/A,Bはアルファベットが入ります) 000A000 000B000 000A000B 000B000A の中から4文字目にBがくるものだけ抽出したいのです。 LIKE %B% では000A000Bも拾ってしまいます。 この場合*B*でいいのでしょうか? (正規表現も試しましたがかなり遅い感じを受けましたので出来れば避けたいです) よろしくお願いいたします。 >>297 ありがとうございました! 一文字ワイルドカードとして_を使っては見たのですが まったく意図する結果が得られなかったので*なのかな?と思っていました。 LIKEのターゲットがCHAR(8)なのでこれが原因みたいですね。 以下のスレから誘導されてきました。 http://pc11.2ch.net/test/read.cgi/db/1234077152/ 先のスレでも回答いただいたのですが、どうやら私の理解が不足している様でして 出来れば初心者にも判りやすく回答いただけないでしょうか。 質問の内容はこの通りです。 環境はVS2008pro C# SQLServer2005EEです。 SQL分でLIKE抽出するときなのですが、%っていうのは「なくても」or「何が何文字あっても」って感じですか? ワイルドカード文字数を指定してLIKE抽出したい場合*を使うのでしょうか? 又、*は「とりあえず何らかの文字が1文字以上ある」なのでしょうか? やりたいことは (0は何らかの数字/A,Bはアルファベットが入ります) 000A000 000B000 000A000B 000B000A の中から4文字目にBがくるものだけ抽出したいのです。 LIKE %B% では000A000Bも拾ってしまいます。 この場合*B*でいいのでしょうか? (正規表現も試しましたがかなり遅い感じを受けましたので出来れば避けたいです) よろしくお願いいたします。 一文字ワイルドカードは_だと教えて頂きましたが、___B%ではまるで抽出できませんでした LINQ使えば、もうADO.NETは不要という時代になってきたのかな・・・ 頑張ってLinq使ってるけど一長一短て感じだなー。 補完的に使うと便利だけど完全にADO.NETを置き換えられるか、つーと色々微妙。 取得結果を1カラムずつループ、とか出来ないし。 Linq to SQLもEntity Frameworkも基本的にORMだから、 他のORMと同じような長所と短所を持っている。 完全な代替にはならない。 <<質問>> 当方の環境ではLike演算子の挙動が1)SqlSeverManagementStudio と 2)ADO.NET(VS2008C#)で異なっているのですが、 原因が解らずはまっております。なんでこんな事がおきるのでしょうか・・・ <<やりたいこと>> XXXA0001のようなデータを抽出したい select max(xxxx) from xxxxx where cd like 'XXX[AB][0-9][0-9][0-9][0-9]%' <<現象>> XXXA0001とか 1)ではヒットするのだが、 2)ではヒットしない <<試行錯誤結果>> 2)では [0-9]の数が1つまでなら、なぜかヒットする ×where cd like 'XXX[AB][0-9][0-9][0-9][0-9]%' ×where cd like 'XXX[AB][0-9][0-9]01%' ×where cd like 'XXX[AB][0-9]0[0-9]1%' ○where cd like 'XXX[AB][0-9]001%' ○where cd like 'XXX[AB]0[0-9]01%' ○where cd like 'XXX[AB]00[0-9]1%' ○where cd like 'XXX[AB]000[0-9]%' >>306 System.Data.SqlClient.qlCommandでは2)は1)と同じ動作になる。 前提条件や再現するソースくらい出しなよ。 likeの後の文字列が途中で切れてると神の啓示があったぞ >>307-309 レス頂き有り難う御座います。 また、中途半端な情報しか出せずに申し訳ありません。 2)の実行環境ですが、プロジェクトにデータセット(XSDファイル)を追加し、 同デザイナ上でクエリ追加()、SQLは306に記述されている構文そのまま(Scalar) になります。 尚、接続先はSqlServer2008Expressになります。 接続文字列は Data Source=XXXXXX\SQLEXPRESS;Initial Catalog=XXXXXXXXX;Persist Security Info=True;User ID=xxxx,Password=xxxx になります。 自分自身DBは1年に数回いじる程度のスキルしか持ち合わせていないため、 何か間違いを犯しているような気はしているのですが、それが特定出来ていないのが現状です。 >>309 パラメータ文字列長に上限値が存在するということでしょうか? 本当に調査したいのならSQLServreProfilerでどんなSQLが発行されたか調べればいい。 >>311 ,312さまレス有り難う御座います。 306で御座います。原因がわかりました。 結論から言えば、309様の神のお告げのとおりで御座いました。 テーブルのフィールドの型がchar(16)で定義されているため、 デザイナでコード生成をすると対応するテーブルアダプタ\コマンド\パラメータの型も char(16)として扱ってしまい、結果として、意図したパラメータが入力されなくなっておりました。 その為、like演算子を用いるパラメータクラスのプロパティ(ProvideType)を Varchar型に変更することで解決することが確認できました。 >>311 さま 実行されたSqlをトレースするソフトがあるなんて知りませんでしたw 同ツールを用いることで、解決にこぎつけました。 >>その他の皆様 私自身DBをよくわかっていないため、的確な情報が出せずに、申し訳ありません。 質問に反応して頂き有り難う御座いました。助かりました!! read_commitedでのinsertでデッドロックすることがあるんですが、そういうものですか? insertでなぜおきるのかわかりません だれかが、インサートしようとしたテーブルに対して、何らかのロックを獲得してたんだろう つか、それほんとにデッドロックか? insertでのロックで考えられるのは索引に対するもの。 カーディナリティの低い索引で広範囲のロックがかかりやすい。 データセットのxscファイルがなんのためにあるのかわからん。 教えてエロい人 yorapaa@yahoo.co.jp, このアドに メールしてくれ データベースの更新に失敗してロールバックが発生した場合、 データテーブルのRowStateとか更新中に取得した自動採番値を更新前の状態に戻す処理はどうしてますか? AcceptChangesDuringUpdateをfalseにしてもRowStateが更新されちゃったり(MySqlConnecter.net) ロールバック時のdatatableのロールバック処理に試行錯誤中です・・・ Transactionつかうんじゃないの? もう少し状況を詳しくお願いします。 >>324 環境はC#2005で、MySqlConnector/Netを使用しています。 処理は以下です。 AcceptChangesDuringUpdateはfalse //Update時にAcceptChangesが実行されないはず try { トランザクション開始 mysqldataadapter.Update(datatable) ← RowUpdatedイベントで自動採番やタイムスタンプの値取得 コミット datatable.AcceptChanges(); } catch (sqlexception) { ロールバック ← このときにデータテーブルの値をUpdate前の状態に戻したい } AcceptChanges()していないのにRowStateが更新されてしまう事と、 Updateが成功したDataRowのタイムスタンプの値をUpdate前の値に戻す処理の実装 をどうすれば良いのかで悩んでいます。 >>325 con.Open(); try { var trans = connection.BeginTrans(); adapter.transaction = trans; adapter.Fill(table); trans.Commit(); } carch { con.Rollback(); } con.Close(); DataAdapter.Fillとかで、すこし時間がかかる場合 検索中ですみたいなメッセージを出したいけど、 マルチスレッドにするしかないのかな。難しそうだな 素直にそのコードの前にマウスポインタを砂時計にするべきじゃないの? そしてタイムアウト時の処理を忘れて 砂時計のままになるんですね、、、 砂時計にしたって、処理待の状態は変わらないんじゃ、、、 BeginInvokeでも使っとれ 型付DataSet、型なしDataSet、ドラッグ&ドロップで生成、SqlCommand… ADO.NETってどう使えばいいのかサッパリわからん。 どうすれば一番楽にアプリを作れるの? なんか1冊いい本教えて。 作りたいのはデスクトップアプリでよくある業務系システム。 >>332 だったら、GUI(デザイナーなど)上でオブジェクトを配置しない方法を使った方が良いんでね? 他のプログラミング言語とかで、DB接続やるのになるべく近い方法にすれば、イメージもしやすい。 GUI(デザイナー)やウィザードは、それらの労力を省力化する為の便利機能なのだから。 俺が使っていた書籍は、 Visual Basic 2005による [実践]データベースプログラミング 谷尻 かおり (著) だけど、公式図書は手元においていた方がいいと思うよ。結構な値段するけど。 >>333 Visual Basic 2005による [実践]データベースプログラミング かなり後悔した1冊だったわ・・・ >>334 具体的にどこが? 俺はこの一つ前のバージョンの書籍を買ったが、 説明がウィザードのオンパレードで終わっていて、 後悔している。 ひと目でわかるMicrosoft Visual Basic 2008 データベース開発入門の方がいいな コレを基礎に複雑なフォームとか作れるようになった 内容はゴク初歩的だけどな 数十万件のデータを更新するとTableAdapter.Updateの処理に約30秒程掛るのですが、 その間、フォームが応答なし状態になってしまいます。 ちゃんと処理は行われているので待っていれば復帰するのですが、 できればDoEventsみたいに処理を受け付けるようにしたいのです。 そのような方法はありますでしょうか? スレッドを使う。backgroundWorkerなど データテーブル作成時に計算結果を表示する列を追加したい。 現在、社員データテーブルの一覧をそのままDataGridViewに表示しています。 DataGridViewに年齢カラムを追加しています。 社員データテーブルの生年月日フィールドの値を用いて年齢を表示させたいと思っています。 現在は、DataGridViewと社員データテーブルをバインドし、 Form_Loadで、TableAdapetr.Fill(社員DataTable)を行ったあと、 DataGridViewの行数だけ For 〜 Next でループして1行ずつ年齢を計算して DataGridViewのセルにセットしています。 効率が悪い感じがしているので、できれば社員DataTableを作成する時点で 自動的に年齢が代入された社員DataTableを作成するか、 もしくはバインドされたDataGridViewに値がセットされるときに自動で 年齢がセルに入るような感じにしたいのですが、わかりません。 ちなみに年齢の計算式は以下です。(インターネットで探してきました) ((Integer.Parse(今日yyyyMMdd) - Integer.Parse(生年月日yyyyMMdd)) / 10000).ToString("##0") うまい方法を教えて頂ければと思います。 環境:VB.NETかC# DB:ACCESSかSQLServer 自己解決致しました。 ACCESSでいろいろやっていたところSQL文の中にかなり関数を入れることが可能でした。 以下のSQL文で年齢を含んだデータテーブルを作成することができました。 有難う御座いました。 SELECT ID, 生年月日, Format((Format(Now(),'yyyymmdd') - Format(生年月日,'yyyymmdd')) / 10000, '#0') AS 年齢 FROM 社員テーブル ちょっと教えてください! 今、VB2010からADO接続でAccess2007のデータ管理するシステム作ってるんだけど、 Accessで添付ファイル型フィールドにJPEGかBMPのファイルを記録して、それをADOで抽出したいのです。 その時の抽出方法としてDatasetを使用するんですが、このDatasetからどうやって添付ファイル型のデータを抜き取ればいいんでしょう? DataSet.Tables("テーブル名").Rows(0)("フィールド名") この構文のあとに何かつけるとか?? >>342 かなり亀レスだけど、このスレは人が少ないから、 プログラム板のVB関連スレでも同じ質問をしてみると いいと思う。 その結果をここで紹介してくれるとなおよろし。 俺の経験談だが、 ADO.NETに関する質問は、プログラム板のVB質問スレでも 丁寧な回答がつく事が多い。 今のVB.NET質問スレにはDB詳しい人おらんようだで ム板で見つけた関連スレを貼っておきます。 データベースプログラミング全般スレ http://hibari.2ch.net/test/read.cgi/tech/1097295557/l50 このスレッドも、DB関連話題という枠組みよりも、プログラムとして どうなのかという話題にする意味合いで、板を移ったほうがいいかもね。 テーブルアダプタの連想配列みたいなことを実現する方法はありますか? イメージとしては Using ta as New myDataAdapters(DataSetName) Dim dt as DataTable ta.Tables(TableName).fill dt.Rows(0)(TargetColumnName)="hoge" ta.Update(dt) End Using こんな感じで ta.Tables(TableName).fill じゃなくて ta.Tables(dt,TableName).fill もしくは dt=ta.Tables(TableName).GetData() こうか 多分基本的なことなんだろうと思うんですが どう調べたらいいのかわからないので教えてください ADO.NET+OLEDBでaccessに接続するときのSQL構文は MDBファイルをAccessで開いて「クエリ」で入力するものと違いますよね (例えばワイルドカードが*と%) この構文は具体的には何の構文になるのでしょうか? ADO.NET固有のものなのかOLEDB固有のものなのかもよくわからないし 詳細はどこに載っているのですか? また、executeNonQuery等を実行する直前のsql文をDebug.printして それをAccessのクエリで動かすと普通に動くのに コード経由ではエラーになったりすることがあって困ってます コード経由で実行されるのと同じ構文で SQLの動作かチェック出来るようなツールが Visual Studioとかに付属しているとデバッグしやすいのですが そういうのはあったりしますか? >>351 > MDBファイルをAccessで開いて「クエリ」で入力するものと違いますよね 何故そう思った >>351 > コード経由ではエラーになったりすることがあって困ってます エラーになったりしない。 そもそもSQLが悪いのか? >>352 実際にMDBファイルをAccessで開いて クエリ→SQLビューでコピペしてちゃんとINSERT文が動くからです。 ttp://msdn.microsoft.com/ja-jp/library/ms187442.aspx ttp://msdn.microsoft.com/ja-jp/library/ms189086%28v=sql.90%29.aspx この辺とかが該当するのかな、とも思ったのですが 後述するようにここは関係なくて、ANSI構文というのが該当するのかもしれません そういう辺りの話は何を見れば載っているのかよくわからんです >>353 今回エラーになっていた箇所は「Image」が 予約語になっていたのが原因で、[Image]とすることで回避出来ました ただ、これは、Accessの予約語ではないです(使用しているバージョンは2002) ttp://support.microsoft.com/kb/286335/ja 実際、MDBを開いてクエリ実行した場合は[]を付けずにちゃんと登録出来ます プログラムからは、[]つきじゃないと動きません もうちょっとググって辿りついたのがこれ(Imageが予約語に含まれている)。 ttp://support.microsoft.com/kb/248738/ja そうだとするとOLEDBとかは関係なくて JET&ANSI構文の話になるのかな? 解決、ここにありましたわ ttp://en.w3support.net/index.php?db=so&id=719115 ADOはデフォルトでSQL92準拠の構文 AccessはデフォルトでSQL89準拠の構文+一部準拠してない(VBのワイルドカード) 特にAccess2000はSQL89しか対応していない また、mdbの設定でモードを変更出来る ということでした VS2005のデータアダプターの同時実行制御オプションONで 生成されるUpdateクエリのWHERE句は、 全列チェックではなく、SELECTで選択した列だけチェックされていますが、 これは、複数のユーザが同じクエリ(選択列)を実行した場合はOKだけど、 そうでない場合はNGじゃない。 EPI使ってるやついる? ActiveRecordでinsert時のkey取得するのってどうやるの? あと、QPEの接続パラメーター教えて 質問があります。 以下のテーブルをDataAdapterで更新します。 変更前のテーブル ID DATA 1 晴れ 2 曇り 変更後のテーブル ID DATA 2 晴れ 1 曇り IDは主キーに設定してあります。 この場合一意制約違反のエラーが起こります。 DataAdapterを使った更新方法で回避する方法はありますか? >>359 1 曇り 2 晴れ UPDATEすればいいだろ >>360 回答ありがとうございます。 質問はテーブルを単純に書きましたがUPDATE以外にINSERTとDLEATEも同時にやりたいので、 DataAdapterを使用しています。 ID部分の入れ替え動作中に一意制約違反になってしまうので、どうにか回避出来る方法がないか探してます。 >>361 仮に ID の最大値が 99 なら、 100足して、100引いたら、どうだべ。 DataAdapter使ってんなら、ID以外の部分を入れ替えればいいだろ IDを書き換えるって発想がまずおかしい IDを書き換えてダブったらエラーになるのは当然で DataAdapterでどうこうするような話じゃないと思うが UPDATEするのやめて、変更行はDELETEしてINSERTするようにすれば? >>364 DataRowに元テーブルの情報まで入っちまってるんで元情報を取っておくことが出来ない やるとするとInsert用のRowを新規作成して元Rowからカラムを一つ一つコピーしていくアホ臭いことしないとならない しょうがないので俺はカラム列挙してコピーするメソッド自作したよ 俺ずっとADOのこと「アド」って読んでたんだけど・・・・ DataAdapterで更新っていうことにこだわってる理由がいまいちわからない。 どうして他の方法ではダメなのか、それを書かないとと思うのだが。 ExecuteNonQueryとか。 エスパーすると スキーマが度々変わってめんどい or カラム型チェックがなくなるのはヤダヤダ あたりじゃないか Visual Studio 2008 でSQL Server 2005 上のデータを表示・更新をするWindows Form アプリケーションを作ろうとしています。 下のようなSQLで取得できるデータが対象。 SELECT D.DataNo, D.Hizuke, D.CustomerID, C.CustomerName FROM TableData D JOIN Customer C on D.CustomerID=C.CustomerID 各カラムはフォーム上のTextboxに連結。 CustomerIDのTextboxを入力すると、CustomerNameのTextboxの表示が書き換えられる。 というのをやりたいんですが。 Windows Form アプリケーションのプロジェクトを新規作成。 データソースを新規作成。 使いそうなSQL Server上のテーブルを選んで追加。 データセットデザイナで、追加-TableAdapter。TableAdapter構成ウィザードを起動 ウィザードに従い、上のようなSQLを貼り付け、完了。 データセットデザイナ上にこんなのができた。 DataTable1 DataTable1TableAdapter Fill, GetData() Form1をデザイナで開き、DataTable1をドラッグ&ドロップ。 データが表示されるところまではできた。 あとどうしたらいいんですか。 read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる