VBAからselect into #table できることもある

Dim Parm As Long
Param= **
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = “接続文字列”
cn.Open

cn.Execute “drop table if exists #table”
cn.Execute “select * into #table from Other where column=” & Param
cn.execute “update #table set ・・・”
以下略

シンプルにこれだけならば#テーブルは作成されますが

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.ConnectionString = “接続文字列”
Set rs = New ADODB.Recordset
cn.Open

rs.open “SQL文”,cn,・・・
以下略

cn.Execute “drop table if exists #table”
cn.Execute “select * into #table from Other where column=” & Param
cn.execute “update #table set ・・・”
以下略

と複雑になるとオブジェクトは無効ですとエラーです。

なぜかはわかりませんがレコードセットが必要ならprivate sub を別に作って
callにしたらうまくいきます。

MySQL ODBC Connector

ODBC8.0connector(32)がいつまにかリリースされていました
32bitアプリは忘れられていなかった
これでAccessから  寿司絵文字が あれ?ここにもはいる? 
 つちよし は? 入る!
いや公開すると表示できない フォントによるのかな?

MySQLはutf8mb4でODBCもコンパチだから入るだろうと
AccessからMysqlへ向かって入力するとなぜかODBCエラー
まあいいか

インストーラーでインストしたら前のドライバを自動削除していた。
親切と言えば親切だろうが知らずに動かしていたら大変な目にあいました。
すべて入れ替えるとは限らないのに・・

Accessのクエリでダイナセット(矛盾を許す)は要注意

select TableA.columnA(主キー),関数(tableB.columnB) from TableA innner join TableB on (tableA.columnA=tableB.No)

とかクエリを元にフォーム作成
関数によってはクエリが参照のみになることがあるらしい
でもどうしても更新削除がしたい
ということでこのクエリをダイナセット(矛盾を許す)にして強引に可能にしてしまう

更新は問題ないと思うがフォームからレコード削除の時 
普通のダイナセットのクエリならクエリに主キーが入っていないTableBのレコードは削除されないのだが
ダイナセット(矛盾を許す)の場合はtableAもTableBもクエリに入っているレコードは削除されてしまう

これで1日棒に振りました

Accessのクエリでdistinct

Accessでクエリ作成 SQLビューでクエリ文から作成するとき

select distinct columnA,columnB from Table

と作ってフォームのソースにすると参照のみになってしまい、更新や追加ができない

デザインビューを見てもdistinctが付いているのはわからないので
つけたことを忘れると何が起こっているのかわからず慌ててしまう

テキスト出力

VBAからテキスト出力はこうしてましたが

Dim TestStr As String
TestStr = “テキスト文字”
Dim Num As Long
Num = FreeFile

Open “c:\TESTopen.txt” For Output As Num
Print #Num, TestStr
Close Num

こういう方法もあります

Dim Stream As ADODB.Stream

Set Stream = New ADODB.Stream
Stream.Mode = adModeReadWrite
Stream.Type = adTypeText
Stream.Charset = “Shift_JIS”
Stream.LineSeparator = adCRLF
Stream.Open

Stream.WriteText TestStr, adWriteLine
Stream.SaveToFile “C:\TESTstream.txt”, adSaveCreateOverWrite
 Stream.Close

openメソッドで出力できるのはshift_jisだけかな
adodb.streamは上のオプションshift_jisをUTF-8にすればUTF-8出力もできます。
ただオプションで出力テキストが微妙に違ってきます。
うちの環境では上と同じテキストを出力するにはこのオプションでした。

PowershellからSQLserver構成2

続きです。
間違いはないはずですがバッチファイルを流すとうまく行きません

powershellにSQLモジュールロードではなく
SQLpowershellを使うとなぜかうまく行きます
スクリプトは全く同じ

これで構成はなんとかクリア
あとはmdfのアタッチ

PowershellからSQLserver構成

SQLserverなどインストした後 構成マネージャーでTCP/IP接続有効とか名前パイプ有効とか設定必要だが
それをpowershellから施行したい

sqlpsというのを読み込んで
getsmoobjectと言うのも使えるようにして・・

調べていろいろやったがなぜか原因不明のエラーを返される

$Tcp=$wmi.GetSmoObject(“ManagedComputer[@Name='”+$Env:computername+”‘]/ ServerInstance[@Name=’インスタンス名’]/ServerProtocol[@Name=’Tcp’]”)
$Tcp.IsEnabled=$true
$Tcp.Alter()

うまくいったのはこんな感じ
違いは変数を省略しただけ
うまくいったけど納得できない

ちなみ名前パイプは
$Np=$wmi.GetSmoObject(“ManagedComputer[@Name='”+$Env:computername+”‘]/ ServerInstance[@Name=’インスタンス名’]/ServerProtocol[@Name=’Np’]”)
$Np.IsEnabled = $true
$Np.Alter()

これでパッケージが完成する、させたい

Nullには要注意 と Alterカラムデータ型


カラム2が数値型の場合
select * from Table where カラム2<>8
ではカラム2がnullを選択しない nullを選びたいときは別に条件を明示の必要ありか


似ているけど
カラム2は文字型
select * from Table where カラム2<>‘8’
では空文字列のカラム2を選択する
空文字列とNullが混在するテーブルがあるときは要注意

mysqlもSQLserverも同じ

あとカラムデータ型変更
SQLserverは
alter Table TableA alter Column ColumnA nvarchar(255) null;
Mysqlは
alter table TableA modify Column ColumnA varchar(255) null;

MySQL8

知らない間にアップデートがありました。
今回メジャーアップデートですので早いうちにアップデートしないと遅れるほど難しくなりそう
ということで数日たいへんでした。
まずGTIDスレーブからアップデート
マイナーアップデートのようにzip解凍、上書きしてmysql_upgradeしたら??できない
クリーンインストしてマスターからdumpしてリストアしたらエラーだらけ
何をやってもエラーだらけなのでもうひとつ念のため5.7の非GTIDサーバを立ててから
もうえいやとサーバもアップデート

いろいろやったけどうちの場合は
非GTID5.7からdumpする際 –default-character-set=binary のオプション
GTID8へのリストアは —-default-character-set=utf8mb4 -f のオプション
が一番エラーが少ないような・・5.7はutf8で立ち上げて途中utf8mb4に変更

サーバがなんとかリストアできたので今度は8のマスターから8のGTIDスレーブへリストア
これもエラーでまくりですが
なぜか
GTID8からdumpのoption   –default-character-set=binary
GTID8へのリストアのoption –default-character-set=utf8
がエラーが一番少なかった。エラーはトリガーやストアドの中の日本語の様な気が?
なんとか今日から稼働しました。

従来の2倍の性能らしいです。

defaultの文字コードはutf8mb4 4バイト絵文字、サロゲート文字がOKです。
のはずですが入力時ODBCエラー やはりODBC8が必要なのでしょうか
今のところODBC8は64bit版のみです

CTE、再帰クエリが使えるようになってます。

あとIDの再利用をしないようになったとかどこかで見ましたが未確認です。

GTIDのdumpですがGTIDへリストアする場合と非GTIDへリストアする場合とoptionを変えないといけないのは面倒くさいです。
MySQL3からMySQL5へのアップデートもたいへんでしたが今度もほどほどに難易度高かったです。

追記 mysqldumpのオプション
GTIDからGTIDへ  –triggers –routines –events
GTIDから非GTIDへ –set-gtid-purged=OFF