//Stored Procedure
ALTER PROCEDURE [dbo].[UserDetails]
(
@OutId NVARCHAR(50) OUTPUT,
@Type NVARCHAR(50) Type,
,@Preload UserType READONLY
)
AS
CREATE TYPE [dbo].[UserType] AS TABLE(
[Id] [int] NULL,
[Name] [nvarchar](50) NULL,
[Company] [nvarchar](100) NULL,
[PNumber] [nvarchar](100) NULL,
[FClass] [nvarchar](100) NULL,
)
GO
package Test;
import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class TestPreload {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<ArrayList<String>> PreloadUser=new ArrayList<ArrayList<String>>();
ArrayList<String> Preload=new ArrayList<String>();
Preload.add("1");
Preload.add("Danny");
Preload.add("123");
Preload.add("123");
Preload.add("N/A");
PreloadUser.add(Preload);
ArrayList<String> Preload2=new ArrayList<String>();
Preload2.add("1");
Preload2.add("Sam");
Preload2.add("123");
Preload2.add("123");
Preload2.add("N/A");
PreloadUser.add(Preload2);
try {
DriverManager
.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
Connection conn = DriverManager
.getConnection("jdbc:sqlserver://....");
CallableStatement stmt = conn
.prepareCall("{call UserDetails(?,?,?)}");
stmt.setString(2, "Test");
stmt.setString(3, PreloadUser.toString());
//stmt.setObject(3, PreloadUser.toString());
stmt.registerOutParameter(1, java.sql.Types.VARCHAR);
stmt.execute();
System.out.println("OUTPUT : " + stmt.getString(1));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
com.microsoft.sqlserver.jdbc.sqlserverexception:操作数类型冲突:nvarchar与com.microsoft.sqlserver.jdbc.sqlserverexception.makefromdatabaseerror(sqlserverexception.java:196)com.microsoft.sqlserver.jdbc.sqlserverstatement.getnextresult(sqlserverstatement.java:1454)com.microsoft.sqlserver.jdbc.sqlserverpreparedstatement.doexecutepreparedstatement(sqlserverpreparedstatement.388)com.microsoft.sqlserver.jdbc.sqlserverpreparedstatement d.doexecute(SqlServerPreparedStatement.java:338)(位于com.microsoft.sqlServer.jdbc.tdsCommand.execute(IOBuffer.java:4026)(位于com.microsoft.sqlServer.jdbc.sqlServerConnection.executeCommand(sqlServerConnection.java:1416)(位于com.microsoft.sqlServer.jdbc.sqlServerStatement.executeCommand(sqlServerStatement.185)(位于com.microsoft.sqlServer.jdbc.sqlServerPreparedStatement.executeStatement(sqlServerStatement.java:160)(位于ServerPreparedStatement.java:320)在carma.testinurence.main(testpreload.java:71)
您正在执行{call UserDetails(?,?,?)}
,但存储过程不接受任何参数。您需要按以下方式更改存储过程:
CREATE PROCEDURE dbo.sp_Students_INS_byPK
@user_id INT ,
@user_name NVARCHAR(50) = NULL ,
@user_company NVARCHAR(100) = NULL ,
@user_pno NVARCHAR(100) = NULL ,
@user_fclass NVARCHAR(100) = NULL ,
AS
BEGIN
SET NOCOUNT ON
INSERT INTO dbo.Students
(
Id ,
Name ,
Company ,
PNumber ,
FClass
)
VALUES
(
@user_id ,
@user_name ,
@user_company ,
@user_pno ,
@user_fclass
)
END
按以下方式更改代码:
CallableStatement stmt = conn.prepareCall("{call UserDetails(?,?,?,?,?)}");
stmt.setInt(1, 1);
stmt.setString(2, "Sam");
stmt.setString(3, "123");
stmt.setString(4, "123");
stmt.setString(5, "N/A");
stmt.execute();
此外,我不明白为什么要通过调用存储过程来将数据插入表中。您可以简单地使用PreparedStatement
来执行此操作。这里有一个例子:
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
try{
DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
conn = DriverManager.getConnection("jdbc:sqlserver://....");
String sql = "INSERT INTO UserType("Id", "Name",
"Company", "PNumber", "FClass") VALUES(?,?,?,?,?)";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, 1);
stmt.setString(2, "Sam");
stmt.setString(3, "123");
stmt.setString(4, "123");
stmt.setString(5, "N/A");
stmt.executeUpdate();
stmt.close();
conn.close();
}catch(Exception ex){
ex.printStackTrace();
}finally{
try{
if(numm != stmt)
stmt.close();
}catch(SQLException se){
se.printStackTrace();
}
try{
if(null != conn)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
}
SimpleJdbcInsert insertUser = new SimpleJdbcInsert(jdbcTemplate)
.withTableName("UserType").usingColumns("Id", "Name",
"Company", "PNumber", "FClass");
Map<String,Object> insertParameters = new HashMap<String, Object>();
/* Put Values */
insertParameters.put("Id", 1);
insertParameters.put("Name", "Sam");
insertParameters.put("Company", "123");
insertParameters.put("PNumber", "123");
insertParameters.put("FClass", "N/A");
Number generatedId = insertUser.execute(insertParameters);
问题内容: 我已经搜索了一段时间,似乎找不到任何真正的答案。 我有一个Oracle存储过程,该存储过程具有许多in参数,这些参数的类型是表rowtype的表。因此,例如: 在pacakge中声明: Oracle过程: 在Java方面,我有3个对应的对象列表,它们表示用Java填充的每个参数。在这种情况下可以使用MyBatis调用Oracle过程吗? 对象本身是具有String和Integer属性以
问题内容: 我需要将字符串数组作为参数传递给MySQL存储例程。该数组可能很长,其元素数量不是固定的。然后,我想将字符串值放入具有一列的内存表中,以便可以处理数据。我不知道这是否可以在MySQL中完成。也许需要肮脏的解决方法。 例如,我有字符串值: 现在,我想从MySQL 表中获取有关这些水果的数据。伪代码: Microsoft SQL Server允许您使用数据类型并将数组作为XML字符串提交,
问题内容: 我在形成文字时可能做错了。假设我有一个简单的存储过程,如下所示: 的定义为: 执行这样的查询: 产生以下结果集: 代替: 我的文字是否有问题,还是应该以其他方式访问该字段?感谢您的任何建议。 问题答案: 指定输入的方式看起来不错,因为使用行和数组构造器语法可以观察到相同的行为: 和: 产生: 如果添加: 在循环内部,输出为: 表明您实际上正在获取一个元组,其中“ message”是您期
我想通过传递数组_列表来调用sql server存储过程。 最后一行给出了错误。无法在那里设置数组。我也试过使用列表,但没有用。
尝试调用MSSQL存储过程。过程基本上是这样的:使用[DATABASE]GO SET ANSI _ NULLS ON GO SET QUOTED _ IDENTIFIER ON GO 更改过程。[stored procedure](@ username varchar(10))as 从表名中选择用户名 输出是:array(0) { }这个数据库中有大量的数据。 我知道与数据库的连接是有效的,但当我