SELECT B.NAME FROM dbo.syscolumns A,dbo.systypes B,dbo.sysobjects  C  WHERE  A.TYPE=B.TYPE  AND A.ID=C.ID AND C.NAME='user' 
AND A.NAME='name'
试试上面的代码。这一条语句只是查出你的 user 表里的 name 字段的类型。其余的依次仿照即可。
更改时,只需要更改表名,和字段名。如:SELECT B.NAME FROM dbo.syscolumns A,dbo.systypes B,dbo.sysobjects  C  WHERE  A.TYPE=B.TYPE  AND A.ID=C.ID AND C.NAME='role' 
AND A.NAME='rolename'

解决方案 »

  1.   

    使用metadata可以检索到数据表的每个字段类型,具体用法看一下api就知道了
      

  2.   

    to single_study() and  onlyxu(未透露姓名男子透露,java开发就是查错):如果知道每个问号对应的表及字段名称,那么得到它的类型是很容易的事情,关键是我怎么知道每个问号对应哪个表及字段?请两位大大看看这个问题的另一个给分点:
    http://community.csdn.net/Expert/topic/4102/4102664.xml?temp=.913418
      

  3.   

    说白的就是如何解析sql。
    先把from和where之间的表名取出来,然后再去找字段名,根据metadata判断类型只是这么做已经变的很麻烦了。而且如果from后面有子查询就更麻烦了。
      

  4.   

    to sgdb(神天月晓):说的真好,你有没有什么好办法?指点一下!
      

  5.   

    请问,你的最终目的是不是要给sql赋值,如果是的话,是否可以用setObject()呢?
    我以前做过一个框架,就是用setObject()来进行统一赋值。
      

  6.   

    to jefferykim(jeff) ( ):我的最终目的是根据SQL自动生成源代码,所以我想知道这些需要绑定的参数的名称及类型。
      

  7.   

    今天上网看见了一个好东东,分享给大家,相信的可以试试呀!这个东东叫cashspace,是个泡点换钱的软件,就是利用你的机器作为广告平台,为广告商作广告,广告商给我一定的费用。如果你不相信就不要往下看了!!!这个软件是在你上网的同时挂在上面就可以实现记点,到一定的点数就可以给你money了如果你想试一试,可以跟着我做:1.首先到http://www.cashspace.com/signup.asp?refID=gouldiae_yu这个网址注册一下用户
      因为注册是英文的,所以罗嗦一下,给不会填写的朋友一个帮助:
      进入上面的网址,在左侧有个login(注册),点击进入注册页面,现在让我们来注册吧
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    × 第一部分是:填写基本数据,以便网站以后能将薪资支票寄送到你手上: ×
    × *Salutation(称呼):Mr.(先生)、Mrs.(太太)、Ms.(小姐) ×
    × *First Name(名) ×
    × *Last Name(姓): ×
    × *Mailing Address(收支票的地址):须用英文填写。 ×
    × *City (城市):从上面的邮寄地址提取,按乡,县,市顺序填入即可。 ×
    * State or Province (省、州或郡):台湾的朋友就打Taiwan。 ×
    * Postal Code (邮政编码):邮寄地址查询时候就会一起提供。 ×
    * Country (国家):这不用教吧! ×
    * E-mail Address(电子邮件地址) ×
    * Please confirm your e-mail address (请再输输入一遍你的电子邮件地址) ×
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    这部分很重要呀,别把姓名填反了,地址要写清楚,尽量简写,因为他的地址输入有限制的,好像是40个字符
    给大家几个英文地址,仿照写一下吧!北京路45号,7栋201房,填Room 201,Building 7, 45 beijing Road。 
    广东省广州中山路3号, No.3,ZhongShan Road,Guangzhou,GuangDong; department the People’Republic of China 
    虹口区西康南路125弄34号201室 
    Room 201,No.34,Lane 125,XiKang Road(South),HongKou District 
    北京市崇文区天坛南里西区20楼3单元101 
    Room 3-101 building No.20,TianTan-NanXiLi Residential ChongWen District 
    BeiJing City 
    江苏省扬州市宝应县泰山东村102栋204室 
    Room 204 building No.102, East TaiShan Residential BaoYin County 
    JiangSu Province ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    × 第二部分是会员调查(Member Survey) ×    
    × 你可以自由填写,或是不予回答(No Comment): ×
    * Age(年龄) ×
    * Education(教育程度) ×
    * Employment(职业) ×
    * Yearly Salaries(年收入) ×
    * Marital status(婚姻状况) ×
    * Family members(家庭成员数目) ×
    * Computer location(计算机位置) ×
    * Have you ever made a purchase on-line?(是否曾网络购物?) ×
    * How many hours do you typically spend on the web in a month?(每个月上网时数?) ×
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    这部分不是很重要就是给调查,如果不想填就都选no comment×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    × 第三部份是要选择自己的使用账号、密码及介绍人回馈方案, ×
    × 记住这部份的数据只要登录之后就无法再做变更,请审慎考虑再做决定: ×
    × *Select a referral system(选择介绍人回馈方案):这个部分非常、 ×
    × 非常重要,请耐心看过我的分析再做决定! ×
    × A - you 60 points + 7 levels: 10, 8, 7, 6, 5, 2, 2 points / h ×
    × B - you 60 points +7 levels: 5, 6, 7, 8, 9, 10, 11 points / h ×
    × C - you 60 points +7 levels: 20, 2, 2, 2, 2, 2, 2 points / h ×
    × *Select a Partner ID(选择使用账号):限定要英文5 – 12字符。 ×
    × *Select a password(选择密码):限定要英文5 – 12字符。 ×
    × *Retype the password to confirm it(再次输入密码以确认) ×
    × *please tell us how you heard about us?(在哪里获知CashSpace的?) ×
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    这部分很重要的,你要选仔细呀!(举例来说,A方案是指当你自己上线1小时可获得60点,而你的第一层下 
    线每上线1小时,你就可获得10点的红利回馈,第二层下线上线1小时, 
    则可获得8点的回馈,之后依7, 6, 5, 2. 2点的次序类推; 
    至于B方案、C方案也都是类似的道理!那么该如何决定要选择何种方案呢? 
    假使你打算长期投入这份,且希望在过一段时间之后获得较 
    大的收益,B方案会是你比较好那么假使你希望可以快一点点见到成效, 
    A方案则是可以优先考虑的选择至于C方案的部份,除非你认为往后介绍的 
    朋友几乎不可能再介绍其它人参与这份工作 )×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    × 第四部份是填写介绍人: ×
    × *Referral Info(推荐人):这个部份请你务必不要留空白 ×
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    所以,请你检视一下字段是不是填着,比如gouldiae_yu (这是我的账号,如果填写我得帐号,我会万分感谢,也可以填写你认识的有号的),
    因为我每天都在挂机, 你一旦加入就会成为我得下线,也就是这个道理,人越多,每小时的点数就越多!!!!待上述数据都填写完毕之后,按Become a Member (成为会员)即完成申请。 基本使用说明 申请完毕后,你会收到来自CashSpace的确认邮件,邮件中有你的会员基本数据,你可以从信件上的链接进入CashSpace网站 ( http://www.cashspace.com/ ), 
    并于网页左侧Download处先行下载广告播放程序(内有两个下载点,一为原始程序,另一则为压缩档),待下载完成
    ,执行该程序,登入后即可开始赚钱。 
    加入完后.. 会开几个网站的,不用管。关闭就可。 
    累计点数的方法。 就打开cashspace 的软件就行了。 
    到了24000点数就 你写上的地址里会邮来支票的。 400美金。 去中国银行换就可以了。 
    拉下线的方法: 
    被推荐的方法。要记得了。。 把您加入的网站的最后部分改成你的ID就可以了。 
    如您的ID是****** 的话 ? 
    http://www.cashspace.com/signup.asp?refID=****** 就这样就可以了。 
    然后像我一样把这篇文章复制了以后找个人多的网站里粘贴就可以了。 
    另外,要特别注意几件事: 
    第一、当漩涡状图样亮起时才算上线,若遇图样暗下时,仅需以鼠标光标 
    由上网下晃过漩涡状图样即可恢复亮起。 右下的图标绿色说明连通,红色说明断开,黄色是待机(鼠标移动即可变绿)
    第二、鼠标光标不可越过漩涡上符号的水平位置,否则将呈现离线状态。 
    你可以把广告条放在桌面的最上面。请记住,这一切都是免费的!!! 
    但是头疼的的是我是在公司上班,那些花花绿绿的画面被领导看到了,怎么办呢?
    想想方法吧,我是将任务管理器打开,然后双击管理器将他调整到广告栏大小,然后盖在上面,希望给打算放弃的人一些帮助 看了这么多如果你想加入的话,别忘了填上我呀http://www.cashspace.com/signup.asp?refID=gouldiae_yu,谢了!!!
    我的qq是:305018471(中午才能上的)
    大家有问题可以联系我,我们共同讨论呀!!!
      

  8.   

    rs.getMetaData().getColumnType(字段名称或者序号);
    返回的是字段类型编码。
      

  9.   

    如果是自动生成源代码,就需要一个比较高层次的抽象,用setObject(Object obj)是很好的解决方案。
    如果利用metadata来确定数据类型,首先要分析sql语句取得表名,然后得到column的数据类型,非常繁琐,不幽雅;其次由于确定column type,要额外查询数据库,性能底下,作为通用框架,显然是不可取的。
      

  10.   

    to whyonly(竹迹) ( ):生成源代码的过程是不需要考虑性能问题的,这跟通用框架是两回事,因为系统运行的是生成后的源代码。谢谢你的指点!
      

  11.   

    两种方法
    1。 select syscolumns
    2。 JDBC metadata
      

  12.   

    给你一个方法参考一下:
      private void displayResults(ResultSet queryResults, int numOfRows)
      {
        int row_cnt = 0;
          try
              {
              // A place-holder to hold the first row of the result set table
              // (headers of the returned columns)
              StringBuffer headerRow = new StringBuffer();
              StringBuffer divider = new StringBuffer();          // Get ResultSetMataData containing the number, types and properties
              // of the columns in the result set
              ResultSetMetaData queryResultsMetaData = queryResults.getMetaData();          int numOfCols = queryResultsMetaData.getColumnCount();
              
              System.out.println("numOfRows=" + numOfRows);
    //          String[][] allRows = new String[numOfRows][numOfCols];          // Construct the first row (headers) of the result table and
              // display it
              for (int i=1; i<=numOfCols; i++)
                  {
                  headerRow.append("  ");
                  headerRow.append(queryResultsMetaData.getColumnLabel(i));
                  headerRow.append("  ");
                  }
              System.out.println(headerRow);          // Construct the divider and display it
              for (int i=0; i<=headerRow.length(); i++) // to account for the tabs
                  divider.append('-');
              System.out.println(divider);          // Get the values of the result set rows and display them
              while (queryResults.next())
                  {
                  // A place-holder to hold the data in the current row of the
                  // result set
                  System.gc();
                  StringBuffer dataRow = new StringBuffer();              // Get column data from every column & display it
                  for (int i=0; i<numOfCols; i++)
                      {
                      dataRow.append("   ");
                      //dataRow.append(queryResults.getString(i));                  // Populate array for verification
    //                  allRows[row_cnt][i] = queryResults.getString(i+1);
    //                  dataRow.append(allRows[row_cnt][i]);
                      dataRow.append(queryResults.getString(i+1));
                      dataRow.append("   ");
                      }
                  System.out.println(dataRow);
                  row_cnt++;
                  }
              }
          catch (Exception e)
              {
              System.out.println("FAILED: Could not display results....");
              e.printStackTrace(System.out);
              }
      } // end of displayResults method
      

  13.   

    to DanielYWoo(绿色毒汁) and rower203(华仔):关键的问题是我怎么得到每个问号(?)所对应的列名称及表名称,至于通过元数据得到这个问号对应的参数的类型是很简单的事情,请参考我的另一个给分点:http://community.csdn.net/Expert/topic/4102/4102664.xml?temp=.1792719
      

  14.   

    哎,都不看JDBC规范!!!调用方法:PreparedStatement.getParameterMetaData()返回ParameterMetaData
    然后调用ParameterMetaData.getParameterType(int iIndex)获取类型,类型是JDBC规范中定义的基类型。最后,送rambostar一句话,各个数据库厂商的实现怎么样就听天由命了。
      

  15.   

    To bison_java(Java野牛):真是惭愧!但ParameterMetaData不能得到每个参数对应的列名称,不只高手有没有什么好方法得到每个参数对应的列名称?