我正在使用Altova XMLSpy从一个GML架构创建数据库。但是,所有字符串类型字段都转换为char(255)。我需要把它变成nvarchar(255)。 我可以用Java做到这一点吗?我认为这将是有用的,因为我需要以这种方式创建多个DB,因此我需要自动化流程。 或者,(我知道这不是问题的标题)我可以将xsd:String重写为XMLSpy将其识别为nvarchar(255)的其他内容吗?
P.S。 XMLSpy向我提供导出到我手动更改所有这些,但逐列。
修改 这个DB是空的,根本没有记录。
EDIT2: 我解决了我的问题,部分原因。现在,它改变了一些列但不是全部。 这是我的代码。哪里错了?
public static void main(String[] args){
DataTypeChanger test=new DataTypeChanger();
test.connect();
test.dropCheckConstraints(); // it drops them successfully, I don't need them.
test.disableConstraints();
test.changeDataType();
//test.enableConstraints();
try {
/*test.st.close();
test.rs.close();*/
test.conn.close();
System.out.println("Disconnected!");
} catch (SQLException e) {
e.printStackTrace();
}
}
public void disableConstraints(){
try {
st = conn.createStatement();
st.execute("EXEC sp_msforeachtable \"ALTER TABLE ? NOCHECK CONSTRAINT all\"");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("Query ne radi!");
}
}
public void enableConstraints(){
try {
st = conn.createStatement();
st.execute("exec sp_msforeachtable @command1=\"print '?'\", @command2=\"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all\"");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("Query ne radi!");
}
}
public void changeDataType(){
try {
st = conn.createStatement();
Statement stt = conn.createStatement();
rs = st.executeQuery("SELECT a.name as ColName, o.name AS TableName FROM sys.syscolumns AS a INNER JOIN sys.systypes AS b ON a.xtype = b.xtype AND b.name = 'char' AND a.length = 255 INNER JOIN sys.objects AS o ON a.id = o.object_id WHERE (o.type = 'u') AND (o.schema_id = 1)");
while (rs.next()){
String tName=rs.getString("TableName");
String cName=rs.getString("ColName");
//System.out.println(tName+" "+cName);
try{
stt.execute("ALTER TABLE "+ tName+" ALTER COLUMN "+cName+" nvarchar(255)");
}catch(SQLException ee){
}
}
stt.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("Query ne radi!");
}
}