从Matlab将数据插入MSSQL

时间:2018-01-20 17:25:57

标签: sql-server matlab

我试图通过matlab将数据插入MSSQL,我无法将字符串值传递给表。这是我的代码:

username = get(handles.edit1,'String'); %edit1 being Tag of ur edit box
password= get(handles.edit2,'String'); %edit1 being Tag of ur edit box
confirm_pass = get(handles.edit3,'String'); %edit1 being Tag of ur edit box
email = get(handles.edit4,'String'); %edit1 being Tag of ur edit box
import System.Data.SqlClient.*
NET.addAssembly('System.Data');
conn = SqlConnection('Data Source=.;Initial Catalog=Ear;Integrated Security=true;');
conn.Open();
cmd = SqlCommand('insert into Register(username,password,confirm_pass,email) values(@username,2,2,4)', conn);
cmd.Parameters.AddWithValue('@username', username.Value);
r = cmd.ExecuteReader();
r.Close()
conn.Close()

如果我直接传递值,我能够执行代码,如下所示:

cmd = SqlCommand('insert into Register(username,password,confirm_pass,email) values(1,2,2,4)', conn);

任何帮助都将不胜感激。谢谢!

修改

username = get(handles.edit1,'String'); %edit1 being Tag of ur edit box
password= get(handles.edit2,'String'); %edit1 being Tag of ur edit box
confirm_pass = get(handles.edit3,'String'); %edit1 being Tag of ur edit box
email = get(handles.edit4,'String'); %edit1 being Tag of ur edit box
import System.Data.SqlClient.*
NET.addAssembly('System.Data');
conn = SqlConnection('Data Source=.;Initial Catalog=Ear;Integrated Security=true;');
conn.Open();
cmd = SqlCommand('insert into Register(username,password,confirm_pass,email) values(username,password,confirm_pass,email)', conn);
r = cmd.ExecuteReader();
r.Close()
conn.Close()

这是我的错误:

使用Register> pushbutton2_Callback时出错(第214行) 消息:无效的列名称'username'。

列名'密码'无效。

无效的列名'confirm_pass'。

无效的列名称'email'。 来源:.Net SqlClient数据提供程序 HELPLINK:

gui_mainfcn出错(第96行)         feval(varargin {:});

注册错误(第42行) gui_mainfcn(gui_State,varargin {:});

错误 @(hObject,EVENTDATA)寄存器( 'pushbutton2_Callback',hObject,EVENTDATA,guidata(hObject))

评估uicontrol回调时出错

表格: id -int username -varchar(50) 密码-varchar(50) confirm_passs-VARCHAR(50) email -varchar(50)

2 个答案:

答案 0 :(得分:0)

.NET中,您可以使用两种不同的方法来定义SqlCommand的参数值:

  1. 通过Parameters.Add,如下:
  2. cmd.CommandText = "DELETE FROM Products WHERE ID = @ID";
    cmd.Parameters.Add("@ID", SqlDbType.Int);
    cmd.Parameters["@ID"].Value = 10;
    
    1. 通过Parameters.AddWithValue,如下:
    2. cmd.CommandText = "DELETE FROM Products WHERE Name = @Name";
      cmd.Parameters.AddWithValue("@Name", "MyProduct");
      

      这两种方法之间的区别很微妙,但非常重要。

      Add使一切明确,但存在两个主要缺点:

      • 需要更多代码和更多努力;
      • 其中一个重载(确切地说是this one),即使已弃用,也可能非常模糊。
      相反,

      AddWithValue从参数值中推断出参数的类型,并且不执行任何类型的验证。后一种方法可能会导致错误的转换,尤其是在以不同方式处理变量类型的环境中使用(例如Matlab)。

      您的代码不难理解,但您忘记描述数据库表结构并提及代码执行产生的任何潜在错误或异常。这迫使我猜测你的实现有什么问题:

      1. 最可能的原因必须在我上面解释的内容中确定:在非AddWithValue编程环境中使用.NET(及其隐式类型)对我来说看起来是一个非常危险的组合。
      2. 您引用的表格字段(usernamepasswordconfirm_passemail)看起来像VARCHAR个字段。尽管如此,您的插入基于数值。我知道这不应该代表一个问题,因为数字字符串可以分配给VARCHAR字段,但我认为,在第一种情况下(VALUES (@username,2,2,4)),可能会发生一些奇怪的事情。
      3. 虽然get(handles.edit1,'String')看起来绝对正确,但我不明白为什么要将username.Value传递给AddWithValue来电。触发get(handles.edit1,'String')后,您的username变量应该已包含所需的值。

答案 1 :(得分:0)

实际上,通过edittext从GUI获得的值是单元格格式。所以我将其转换为字符串,然后执行查询。

以下是我的回答:

username = get(handles.edit1,'String'); %edit1 being Tag of ur edit box
password= get(handles.edit2,'String'); %edit1 being Tag of ur edit box
confirm_pass = get(handles.edit3,'String'); %edit1 being Tag of ur edit box
email = get(handles.edit4,'String'); %edit1 being Tag of ur edit box
username=username{1};
password=password{1};
confirm_pass=confirm_pass{1};
email=email{1};
import System.Data.SqlClient.*
NET.addAssembly('System.Data');
conn = SqlConnection('Data Source=.;Initial Catalog=Ear;Integrated Security=true;');
conn.Open();
testpath='insert into Register(username,password,confirm_pass,email) values';
open='(''';
close=''')';
string1 = strcat(testpath,open,username);
string2 = strcat(string1,''',''',password);
string3 = strcat(string2,''',''',confirm_pass);
string4 = strcat(string3,''',''',email);
string5 = strcat(string4,close);
disp(string5);
cmd = SqlCommand(string5, conn);
cmd.ExecuteNonQuery();
conn.Close()