違いは色々あると思うけど備忘録
MySQLで日付だけ取得したい場合 current_date
MSSQLでは convert(date,getdate())
追加
システム時刻取得は
MSSQLはgetdate()
mysqlはNow
ちなみにACCESSもNow
違いは色々あると思うけど備忘録
MySQLで日付だけ取得したい場合 current_date
MSSQLでは convert(date,getdate())
追加
システム時刻取得は
MSSQLはgetdate()
mysqlはNow
ちなみにACCESSもNow
ODBC接続MySQLテーブルに更新クエリが競合エラー と書いたけれど
バックエンドDBがMSSQLだったら? SQL Server 2016 をバックエンドにNorthWind.accdbで実験
ODBC設定を開くとMSSQL関係は2つある?よくわからないがSQL Serverを選択
MYSQLのようなReturn matched rows instead of affected rowsのODBC設定が見つからない
MSSQLにはshow processlist はないのでコマンドプロンプトでnetstat | find “ポート” で確認
競合エラーは起きないものの”*** where column=(?)” cmd.execute,param 更新クエリ発行では接続が増え続ける。
“*** where column=” & param では増えない。
バックエンドはMSSQLに決定して
ODBCとcurrentproject.connectionはやめて接続文字列のdirectなんちゃら接続で進めていくこととする
カラム数が100を超えるようなテーブルを扱う際、あるカラム名が存在するのかどうか確認するのが面倒なので
Public Function isnullColumn(paramColumnName As String, paramTableName As String) As Boolean
なるものを・・バックエンドはMSSQL
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.ConnectionString = “接続文字列”
cn.Open
rs.Open “select column_name from DBの名前.information_schema.columns where table_name='” & paramTableName & “‘”, cn
rs.MoveFirst
Do Until rs.EOF
If rs!column_name = paramColumnName Then
isnullColumn = False
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
exit function
End If
rs.MoveNext
Loop
isnullColumn = True
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Function
最初丁寧にexitでループを抜けていたがそれはここではX
罠にかけたら即終わるべし・・かな?
バックエンドのデータベースに対してフロントエンドからVBAでアクションクエリを発行するとき
Dim cn as ADODB.Connection
Dim rs as ADODB.Recordset
Set cn=New ADODB.Connection
Set rs=New ADODB.Recordset
cn.ConnectionString=”接続文字列”
cn.open
rs.open “アクションクエリ文”,cn
のあとに
rs.close と書くとエラーなのです。取っていないレコードセットを閉じるからですが
書かなきゃ通るからまあいいかとしていましたがだめらしいです
Dim cn as ADODB.Connection
Set cn=New ADODB.Connection
cn.ConnectionString=”接続文字列”
cn.open
cn.Execute “アクションクエリ文”
が正解なのか?でしょうね。
dim Ipt as Variant
Ipt=inoutbox(“ユーザー名を入力して下さい”)
で未入力でOKボタンを押しても、キャンセルボタンを押しても
Ipt=””
同じ戻り値らしいです。
なのでキャンセルボタンで条件分岐したい場合は
if StrPtr(Ipt)=0 then
らしいです。
1607から1703にcreators updateしたら一部のPCでダウンロード0%が続いていましたが
どうにもならないので放置
この度の5月のupdateでやっと治ったので備忘録です。
該当のPCをネットへ接続
net stop bits
net stop wuauserv
del C:\Windows\SoftwareDistribution
net start bits
net start wuauserv
繰り返すもだめで
レジストリの
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\
でwsus サーバの名前を削除
グループポリシーのwindowsupdateのwsusを未構成に変更して再度上を繰り返した後、windowsupdate
これで最新までupdateして、あらためてグループポリシーでwsusクライアント設定しなおして
wsusサーバにつなげると開通しました。
やっとです。
wordpressですが自動更新で英語版にアップグレードされます。
備忘録のブログだからどうでも良いですが・・なあんかなんかなあ
ACCESS2016のサンプルデータベースNorthwind.accdbで実験
テーブルの社員をMySQLへエクスポート 名前はsyainに変更し ODBCでリンク
テスト用のプロシージャ作成
sub mytest()
Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim strSQL As String
strSQL = “UPDATE syain SET syain.氏名 = ‘おれおれ’ WHERE syain.社員コード=?”
Set cn = CurrentProject.Connection
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = strSQL
cmd.Prepared=True
cmd.Execute , 110
cn.Close
Set rs = Nothing
Set cmd = Nothing
Set cn = Nothing
End Sub
パラメータ付き更新クエリの発行です。
1回目は成功 そして何もせず続けて2回目実行
2回目以降は実行時エラー-2147467259 他のユーザーが同じデータに対して同時に変更を試みているので、プロセスが停止しました
他のユーザーって誰もいませんけど?
こういう仕様なんだろうと試行錯誤して
Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim strSQL As String
Dim Param As Long
strSQL = “UPDATE syain SET syain.氏名 = ‘おれおれ’ WHERE syain.社員コード=” & Param
Param = 105
Set cn = CurrentProject.Connection
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = strSQL
cmd.Prepared=True
cmd.Execute
cn.Close
Set rs = Nothing
Set cmd = Nothing
Set cn = Nothing
End Sub
とパラメータをsql文の外に出すと競合エラーが出ないことがわかりました。
なぜ最初の構文で競合エラーかずっとわからなかったのですが
VBAからの更新クエリの返事にMySQLがaffected rowsを
返すかららしい。
ODBCのオプション変更でも回避できるようです。こちらの方が簡単ですね。
Return matched rows instead of affected rows
https://ameblo.jp/blueskyame/entry-10247966762.html
しかしまだわからない点があって
Return matched rows instead of affected rows
で競合エラーは出なくなりますがクエリを発行するたびに新しいODBC接続になります。
パラメータsql文外コードでは接続は増えません。
accessのバージョンでも挙動が異なるし難しい
たぶんACEになってからでしょうか
2000では何も問題はなかった。
any_windowsOS_64bit access2016_32bit odbc5.3unicode mysql5.7.17
以前より気になっていたけど
Dim rs as New ADODB.Recordset
Set rs = New ADODB.Recordset
と書いても問題ないし
Dim rs as ADODB.Recordset
Set rs = New ADODB.Recordset
と書いても問題ない、New ってなんだといろいろググってみました。
オブジェクト変数とは何ぞや、メモリーに領域を確保云々 とかは置いといて
宣言文にNewを入れるのはVB6とVBAでしか通用しないらしい
Dim rs as New ADODB.Recordset
一文で
Dim rs as ADODB.Recordset
Set rs = New ADODB.Recordset
のセット注文らしい
ということは最初の構文はラーメンセットとラーメンオーダーしてるようなもんですね
まあ普通は・・Stringを例にすれば
Dim Str as String
Str = “あいうえお”
の宣言してから、変数代入が由緒正しき作法でしょうから
今後は宣言に New ADODB.Recordset とかはやめよう
こんにちは
値渡しと参照渡し
sub sample(Byval Str as string) とか sub sample(ByRef Str as string) とかいうやつです。
Google先生に聞けばその時はなるほどと分かったようなつもりだけど、説明せよと言われると??
自分も call *** は書きますがせいぜい条件分岐が長すぎてわかりやすくするためsubに分けたり
public function sample(param as long) as boolean のようなパブリック関数呼び出しなので
値渡し、参照渡しは意識したことがなかった。
結局、値渡しは値を sub に渡すだけ
渡したら知らんぷり
参照渡しは引数として渡して一緒に使いましょう
ということなのか?
そういう風に覚えよう。
Byvalのvalはvalueでしょうね、持ってけ!ドロボー、返せと言っても返さんでいいからな!・・かな?
Byrefのrefはreferenceかな? 参照、紹介、参考とかいう意味だな。 これあげるね、でも必要な時は声かけるから返してね、ラッピングして・・かな?
ちなみにVBAの場合は書かなければByrefがデフォルトだそうな。
実はヤフーブログで書こうと思ったのですがどうも落ち着かないのでwordpressで・・
VBAといいつつ最初から脱線してPingの話です
管理している小さなLANは基本は閉鎖したLANです。
なのでデフォルトゲートウェイは面倒くさいのでもう未記入にしておこう
と思ったらaccessのaccdbが起動時エラー
起動時に実行するモジュールVBAでpingを打たせているのですが
戻り値を取得できない。
cmd.exeで実際に打ってみると
ダミーのデフォルトゲートウェイを記入している場合
192.168.100.1 からの応答:宛先ホストに到達できません。
未記入の場合だと
ping:転送に失敗しました。一般エラーです。
返事が違いますね。pingは打たずにエラーを吐いている模様。
pingと命令したら必ず打つものだと思っていたので・・
恥ずかしながら知りませんでした。
ping 192.168.100.1 | find “到達できません”
if error level 0 (****
なんてバッチファイルも通用しなくなります。
うちの場合デフォルトゲートウェイは必ず記入すべし。