MATLAB 中具有可变数量参数的 SQLite 语句
SQLite statements with a variable number of parameters in MATLAB
我在 MATLAB 中编写 GUI 并使用 mksqlite
。我在向它传递参数时遇到问题。
命令是 mksqlite([ 'INSERT INTO ' , z , ' VALUES (?)' ], data);
其中:
z = 'table name'
、'table name'
是从列表框中选择的。
data
插入来自 inputdlg
。
问题出在 ?
参数上,因为不同的表具有不同的列数。有人知道以动态方式声明 ?
的方法吗?
a = get(handles.listbox1,'String');
b = get(handles.listbox1,'Value');
tabela=a{b};
disp(tabela);
mksqlite( 'param_wrapping', 1 );
mksqlite( 'result_type', 1 );
[results,colnames] = mksqlite(['SELECT * FROM ', tabela])
disp(results);
e=fieldnames(results);
v=size(e);
for r=1:v
prompt={'Wprowadź '};
dlg_title = 'Wprowadź ';
num_lines = 1;
answer = inputdlg(prompt,dlg_title,num_lines);
imie=answer{1};
disp(imie);
t=answer{1};
data{r}=t;
disp(data);
z=a{b};
end;
mksqlite([ 'INSERT INTO ' , z , ' VALUES (?,?,?,?)' ], data); %// << this should be dynamic
想法是您应该动态创建 VALUES(...)
或为每个 table 案例获取预定义语句。
您可以尝试使用 String
到 String
映射,其中键是 table 名称,值是 VALUES
语句。这可以在 MATLAB 中使用 containers.Map
对象来实现。这是我的意思的一个例子:
假设您的 table 名字是 table_names = {'table1','table2','table3'};
,我们假设这些 table 分别有 2、3 和 4 个字段。因此,SQL 命令的相应 VALUES
部分将是:sql_values = {'VALUES (?,?)','VALUES (?,?,?)','VALUES (?,?,?,?)'};
现在我们用这些 String
组合构建一个 Map
:
values_map = containers.Map(table_names,sql_values);
构建 Map
后,您可以使用从列表框中获得的 table 名称(代码中的 a
)并检索正确的 VALUES
语句:
vals_str = values_map(a);
或者,您可以使用逻辑来确定 ?,
的正确数量以放入 VALUES
:
之后的括号中
switch a
case 'table1'
nVals = 2;
case 'table2'
nVals = 3;
case 'table3'
nVals = 4;
end
vals_str = ['VALUES (' repmat('?,',[1 nVals-1]) '?)'];
注意:您可以在您的案例中保留不同的 vals_str
,而无需在运行时构建 Strings
。由于无法解释的原因,我个人不太喜欢这样的版本。
最后,您在 mksqlite
中使用 vals_str
:
mksqlite(['INSERT INTO ' z ' ' vals_str], data);
我在 MATLAB 中编写 GUI 并使用 mksqlite
。我在向它传递参数时遇到问题。
命令是 mksqlite([ 'INSERT INTO ' , z , ' VALUES (?)' ], data);
其中:
z = 'table name'
、'table name'
是从列表框中选择的。data
插入来自inputdlg
。
问题出在 ?
参数上,因为不同的表具有不同的列数。有人知道以动态方式声明 ?
的方法吗?
a = get(handles.listbox1,'String');
b = get(handles.listbox1,'Value');
tabela=a{b};
disp(tabela);
mksqlite( 'param_wrapping', 1 );
mksqlite( 'result_type', 1 );
[results,colnames] = mksqlite(['SELECT * FROM ', tabela])
disp(results);
e=fieldnames(results);
v=size(e);
for r=1:v
prompt={'Wprowadź '};
dlg_title = 'Wprowadź ';
num_lines = 1;
answer = inputdlg(prompt,dlg_title,num_lines);
imie=answer{1};
disp(imie);
t=answer{1};
data{r}=t;
disp(data);
z=a{b};
end;
mksqlite([ 'INSERT INTO ' , z , ' VALUES (?,?,?,?)' ], data); %// << this should be dynamic
想法是您应该动态创建 VALUES(...)
或为每个 table 案例获取预定义语句。
您可以尝试使用 String
到 String
映射,其中键是 table 名称,值是 VALUES
语句。这可以在 MATLAB 中使用 containers.Map
对象来实现。这是我的意思的一个例子:
假设您的 table 名字是 table_names = {'table1','table2','table3'};
,我们假设这些 table 分别有 2、3 和 4 个字段。因此,SQL 命令的相应 VALUES
部分将是:sql_values = {'VALUES (?,?)','VALUES (?,?,?)','VALUES (?,?,?,?)'};
现在我们用这些 String
组合构建一个 Map
:
values_map = containers.Map(table_names,sql_values);
构建 Map
后,您可以使用从列表框中获得的 table 名称(代码中的 a
)并检索正确的 VALUES
语句:
vals_str = values_map(a);
或者,您可以使用逻辑来确定 ?,
的正确数量以放入 VALUES
:
switch a
case 'table1'
nVals = 2;
case 'table2'
nVals = 3;
case 'table3'
nVals = 4;
end
vals_str = ['VALUES (' repmat('?,',[1 nVals-1]) '?)'];
注意:您可以在您的案例中保留不同的 vals_str
,而无需在运行时构建 Strings
。由于无法解释的原因,我个人不太喜欢这样的版本。
最后,您在 mksqlite
中使用 vals_str
:
mksqlite(['INSERT INTO ' z ' ' vals_str], data);