MATLAB 中具有可变数量参数的 SQLite 语句

SQLite statements with a variable number of parameters in MATLAB

我在 MATLAB 中编写 GUI 并使用 mksqlite。我在向它传递参数时遇到问题。

命令是 mksqlite([ 'INSERT INTO ' , z , ' VALUES (?)' ], data); 其中:

问题出在 ? 参数上,因为不同的表具有不同的列数。有人知道以动态方式声明 ? 的方法吗?

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 案例获取预定义语句。

您可以尝试使用 StringString 映射,其中键是 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);