Mijn vraag
Ik loop tegen de standaard limiet aan van het aantal toegelaten variabelen die mogen worden gebruik in een geparametriseerde statement (deze limiet is 999), deze kun je verhogen maar dit gaat niet via de standaard procedures (of ik heb het nog niet gevonden). Op stackoverflow liep ook iemand tegen hetzelfde probleem aan maar dan in c#.
Relevante software en hardware die ik gebruik
Visual Studio 2019 Community
Wat ik al gevonden of geprobeerd heb
Info: https://sqlite.org/c3ref/c_limit_attached.html
Op stackoverflow kwam ik dit tegen: https://stackoverflow.com...-max-compound-select-in-c weliswaar voor c# maar dat kan omgezet worden naar vb.net
Als ik setlimit() aanroep en de eerste lijn uitvoe, krijg ik een System.NullReferenceException
Hoe krijg ik die 0-ref weg of hoe kan ik toch zonder de limiet te veranderen de sql uitvoeren (al is het in stukken)??
Ik loop tegen de standaard limiet aan van het aantal toegelaten variabelen die mogen worden gebruik in een geparametriseerde statement (deze limiet is 999), deze kun je verhogen maar dit gaat niet via de standaard procedures (of ik heb het nog niet gevonden). Op stackoverflow liep ook iemand tegen hetzelfde probleem aan maar dan in c#.
Relevante software en hardware die ik gebruik
Visual Studio 2019 Community
Wat ik al gevonden of geprobeerd heb
Info: https://sqlite.org/c3ref/c_limit_attached.html
Op stackoverflow kwam ik dit tegen: https://stackoverflow.com...-max-compound-select-in-c weliswaar voor c# maar dat kan omgezet worden naar vb.net
C#:
1
2
3
4
5
6
7
8
| [DllImport("sqlite3.dll")] static extern int sqlite3_limit(IntPtr dbHandle, int id, int newVal); private void SetLimit(SqliteConnection conn, int newLimit) { object sqlVar = conn.GetType().GetProperty("_sql", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(conn); IntPtr dbHandle = (IntPtr) sqlVar.GetType().GetProperty("handle", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(sqlVar); sqlite3_limit(dbHandle, 9, newLimit); } |
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
| Imports System.Reflection Imports System.Runtime.InteropServices <DllImport("sqlite3.dll")> Private Shared Function sqlite3_limit(ByVal dbHandle As IntPtr, ByVal id As Integer, ByVal newVal As Integer) As Integer End Function Private Sub SetLimit(ByVal conn As SqliteConnection, ByVal newLimit As Integer) Dim sqlVar As Object = conn.[GetType]().GetProperty("_sql", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(conn) Dim dbHandle As IntPtr = CType(sqlVar.[GetType]().GetProperty("handle", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(sqlVar), IntPtr) sqlite3_limit(dbHandle, 9, newLimit) End Sub |
Als ik setlimit() aanroep en de eerste lijn uitvoe, krijg ik een System.NullReferenceException
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| Public Function Replace(Tablename As String, Columns As String, data As Dictionary(Of Integer, List(Of String))) As Integer Replace = -1 If data.Count < 1 Then Exit Function Try Using cmd As New SQLiteCommand("REPLACE INTO " & Tablename & " (" & Columns & ") VALUES @vars;", New SQLiteConnection(dbConnection)) PrepareValues(Columns, data, cmd) cmd.Connection.OpenAsync() 'cmd.Connection.Open() Using trans As SQLiteTransaction = cmd.Connection.BeginTransaction Replace = cmd.ExecuteNonQuery() trans.Commit() End Using If bdebug Then SqlString(cmd, Replace) cmd.Parameters.Clear() cmd.Connection.Close() End Using Catch e As Exception Throw New Exception(e.Message) End Try End Function ''' <summary> ''' prepare the data values to get parametrized in the sqlitecommand ''' </summary> ''' <param name="Columns">Column names between '' and seperated by comma</param> ''' <param name="Data">the data</param> ''' <param name="Command">SQLitecommand</param> Private Sub PrepareValues(ByRef Columns As String, ByRef Data As Dictionary(Of Integer, List(Of String)), ByRef Command As SQLiteCommand) Try Dim values As String = "" ', key As String = "" Dim s() = Columns.Split(New Char() {","c}) Dim counter As Integer = 0 For Each val As KeyValuePair(Of Integer, List(Of String)) In Data If s.Count = val.Value.Count Then values &= "(" For i = 0 To val.Value.Count - 1 'key = val.Key & i.ToString values &= "@" & counter & "," Command.Parameters.AddWithValue("@" & counter, val.Value(i)) counter += 1 Next i values = values.Substring(0, values.Length - 1) & ")," End If Next If counter >= 999 Then SetLimit(Command.Connection, counter + 5) Command.CommandText = Command.CommandText.Replace("@vars", values.Substring(0, values.Length - 1)) values = Nothing s = Nothing Catch ex As Exception Command.Parameters.Clear() MessageBox.Show(ex.Message, "sqLite: PrepareValues() error") Debug.WriteLine(ex.ToString) End Try End Sub |
Hoe krijg ik die 0-ref weg of hoe kan ik toch zonder de limiet te veranderen de sql uitvoeren (al is het in stukken)??
Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag