System.Data.SQLite (SQLite ADO.NET 2.0 Provider)
System.Data.SQLite (SQLite ADO.NET 2.0 Provider)

ことの始まりは、つい先日 SourceForge.net の RSS から ADO.NET 2.0 Provider for SQLite が 1.0.42.0 から 1.0.43.0 にバージョンアップしたのを知ったので、早速バージョンアップしてみました。

インストールも特に問題なく完了。SQLite3.4かぁ。ふーん。

でもって、開発中のアプリのコーディングを再開してしばらくすると、不可解なエラーが。

色々調べてみると、SQLのMAX関数やCOUNT関数で件数とかをチェックしているロジックが機能しない。intで返ってくるはずのところがstringになっていたり。それで変換できないエラーとか起こっている。なんじゃこれ!
ウーン、特に手を入れてないのにな…、と、ふと DataSet.Designer.cs を直接除いてみると、なんかおかしい。ん?

なんで COUNT で件数返すだけなのに return が object や string なんだ??

とりあえず、ADO.NET 2.0 Provider for SQLiteのバージョンを1.0.42.0に戻してみると、ソースも元に戻る。ウーン、バグなんだろうか?それともこういう仕様なんだろうか?

とりあえず、時間も無いので、1.0.42.0で開発続行しました。

SQLite-1.0.42.0-binary.exe

	// MAX() にて最大値を求めているクエリー
	[System.Diagnostics.DebuggerNonUserCodeAttribute()]
	[System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
	public virtual System.Nullable ScalarQueryTest1(long xxx_id) {
		System.Data.SQLite.SQLiteCommand command = this.CommandCollection[6];
		command.Parameters[0].Value = ((long)(xxx_id));
		System.Data.ConnectionState previousConnectionState = command.Connection.State;
		if (((command.Connection.State & System.Data.ConnectionState.Open)
			!= System.Data.ConnectionState.Open)) {
				command.Connection.Open();
		}
		object returnValue;
		try {
			returnValue = command.ExecuteScalar();
		}
		finally {
			if ((previousConnectionState == System.Data.ConnectionState.Closed)) {
			command.Connection.Close();
		}
	}
	if (((returnValue == null)
		|| (returnValue.GetType() == typeof(System.DBNull)))) {
			return new System.Nullable();
		}
		else {
			return new System.Nullable(((long)(returnValue)));
		}
	}
	// COUNT() にて最大値を求めているクエリー
	[System.Diagnostics.DebuggerNonUserCodeAttribute()]
	[System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
	public virtual System.Nullable ScalarQueryTest2(long xxx_id) {
		System.Data.SQLite.SQLiteCommand command = this.CommandCollection[7];
		command.Parameters[0].Value = ((long)(xxx_id));
		System.Data.ConnectionState previousConnectionState = command.Connection.State;
		if (((command.Connection.State & System.Data.ConnectionState.Open)
			!= System.Data.ConnectionState.Open)) {
			command.Connection.Open();
		}
		object returnValue;
		try {
			returnValue = command.ExecuteScalar();
		}
		finally {
			if ((previousConnectionState == System.Data.ConnectionState.Closed)) {
			command.Connection.Close();
			}
		}
		if (((returnValue == null)
			|| (returnValue.GetType() == typeof(System.DBNull)))) {
			return new System.Nullable();
		}
		else {
			return new System.Nullable(((long)(returnValue)));
		}
	}

SQLite-1.0.43.0-binary.exe

	// MAX() にて最大値を求めているクエリー
	[System.Diagnostics.DebuggerNonUserCodeAttribute()]
	[System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
	public virtual object ScalarQueryTest1(long xxx_id) {
		System.Data.SQLite.SQLiteCommand command = this.CommandCollection[6];
		command.Parameters[0].Value = ((long)(xxx_id));
		System.Data.ConnectionState previousConnectionState = command.Connection.State;
		if (((command.Connection.State & System.Data.ConnectionState.Open)
			!= System.Data.ConnectionState.Open)) {
			command.Connection.Open();
		}
		object returnValue;
		try {
			returnValue = command.ExecuteScalar();
		}
		finally {
			if ((previousConnectionState == System.Data.ConnectionState.Closed)) {
				command.Connection.Close();
			}
		}
		if (((returnValue == null)
			|| (returnValue.GetType() == typeof(System.DBNull)))) {
			return null;
		}
		else {
			return ((object)(returnValue));
		}
	}
	// COUNT() にて最大値を求めているクエリー
	[System.Diagnostics.DebuggerNonUserCodeAttribute()]
	[System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
	public virtual string ScalarQueryTest2(long xxx_id) {
		System.Data.SQLite.SQLiteCommand command = this.CommandCollection[7];
		command.Parameters[0].Value = ((long)(xxx_id));
		System.Data.ConnectionState previousConnectionState = command.Connection.State;
		if (((command.Connection.State & System.Data.ConnectionState.Open)
			!= System.Data.ConnectionState.Open)) {
			command.Connection.Open();
		}
		object returnValue;
		try {
			returnValue = command.ExecuteScalar();
		}
		finally {
			if ((previousConnectionState == System.Data.ConnectionState.Closed)) {
				command.Connection.Close();
			}
		}
		if (((returnValue == null)
			|| (returnValue.GetType() == typeof(System.DBNull)))) {
			return null;
		}
		else {
			return ((string)(returnValue));
		}
	}

今から思えば安易なバージョンアップがいけなかったんです。ちゃんとリリースノートとか見ましょう、ということでした。