精华内容
下载资源
问答
  • 这两天有个可视化项目需要与前端对接,但是数据却处理不成想要的List类型数据(初学没什么功底) 在网上找了许多寻找特定字段的方法,相信大家看到最多的就是以下这个(在这里我引用一下): <!-- Book全部...

    这两天有个可视化项目需要与前端对接,但是数据却处理不成想要的List类型数据(初学没什么功底)

    在网上找了许多寻找特定字段的方法,相信大家看到最多的就是以下这个(在这里我引用一下):

    <!-- Book全部字段 -->
    <resultMap id="BaseResultMap" type="com.lgsc.cjbd.book.model.Book">
        <id column="book_id" property="bookId" jdbcType="BIGINT" />
        <result column="book_name" property="bookName" jdbcType="VARCHAR" />
        <result column="press" property="press" jdbcType="VARCHAR" />
        <result column="author" property="author" jdbcType="VARCHAR" />
        <result column="translator" property="translator" jdbcType="VARCHAR" />
        <result column="isbn" property="isbn" jdbcType="CHAR" />
    </resultMap>
     
    <!-- 定义resultMap,type为HashMap -->
    <resultMap id="PartBookMap" type="java.util.HashMap">
        <id column="book_id" property="bookId" jdbcType="BIGINT" />
        <result column="book_name" property="bookName" jdbcType="VARCHAR" />
        <result column="author" property="author" jdbcType="VARCHAR" />
    </resultMap>
     
    <!-- 查询语句 -->
    <select id="selectPartBook" resultMap="PartBookMap">
        select book_id, book_name, author from book
    </select>

     

    首先,<!-- Book全部字段 -->下面这个resultMap完全可以不要,我们可以看到它的查询语句select标签这里,完全没有引用到 <!-- Book全部字段 -->那个resultMap的任何东西,所以说没必要存在。

    重点是<!-- 定义resultMap,type为HashMap -->这里,我们先了解一下type为什么要为HashMap:因为它用的是List<Map<String, Object>>类型来定义的抽象方法“selectPartBook”的,这个类型返回一个Map类型的列表(大概就是这样子:[{"name":"张三"},{"age":20},]),而type这个属性,就是返回值的类名(我们可以让它为String、Integer.......),所以它想返回一个Map类型的数据,这里就填一个HashMap的类名(Map在HashMap类里面)。

    那么接下来的id(黄色字体)就简单了,它就是一个相当于我们姓名的存在,纯粹是为了知道这个resultMap它是谁,随便取都可以。

    而resultMap里面的

    id(红色字体):用于设置主键字段与领域模型属性的映射关系,里面需要填写数据库中某个表的主键信息

    result:用于设置普通字段与领域模型属性的映射关系,里面填写数据库中某个表的其他键信息

    column:是数据库的某个表中的列名

    property:填写与column中对应的代码内的属性名

    例如有Student类,里面有id,name两个属性;数据库中有一个student表,里面有ID(主键),NAME两个列名。

    那么就这样填<id column="ID" property="id" />;<result column="NAME" property="name">

    jdbcType:就是数据库中数据的类型(推荐不写,写了不但繁琐而且还可能报错,起码我这报错了~.~)

     

    所以推荐这样写就完事了:

    <resultMap id="PartBookMap" type="java.util.HashMap">
        <id column="book_id" property="bookId" />
        <result column="book_name" property="bookName" />
        <result column="author" property="author" />
    <!-- 要查询什么字段,这里面就写什么字段的信息,上面的type想返回上面类型就返回上面类型 -->
    </resultMap>
     
    <!-- 查询语句 -->
    <select id="selectPartBook" resultMap="PartBookMap">
        select book_id, book_name, author from book
    </select>

    参考网址:https://www.cnblogs.com/qcxdoit/p/7089418.html

    参考网址:https://blog.csdn.net/menghuannvxia/article/details/82906341

     

    展开全文
  • 概述: 外部内容类型数据,...非常方便地在SharePoint中修改删除SQL数据库的数据,并且SharePoint还提供了字段级的支持,您可以在任何List当中插入一个External Data外部数据字段,用来引用SQL表中的某一行,...

    概述:

    外部内容类型和数据,SharePoint从2010这个版本开始就对BCS提供非常强大的支持,点点鼠标就可以取代以前直接编辑XML的方式来设置SharePoint到SQL数据库的连接。非常方便地在SharePoint中修改删除SQL数据库的数据,并且SharePoint还提供了字段级的支持,您可以在任何List当中插入一个External Data外部数据字段,用来引用SQL表中的某一行,并显示指定字段的值。 我们经常要用到程序去自动滴修改值,这个类型栏的值,是可以直接通过“Iiem[Field]=Value”这个语句简简单单地把它更改了的嘛?答案是否定的,如果要改这个BCS类型的值,您可能需要十几行代码,我们慢慢给您开讲。

    此时,您有没有觉得SharePoint就像一个万能插头一样,什么样的“数据”,都能插得进来呢? “公牛牌!” ,Oh no... 是 “母牛牌” ,你懂的!

     

    准备工作

    在SharePoint 2010 和 SharePoint 2013 当中我们可以通过SharePoinit Desinger很方便地设置一个基于SQL SERVER的或是其它数据源的,“外部内容类型”,这样我们就可以在SharePoint 查询、修改、添加这个数据表,如下图所示:

     

     

    本教程不是初级入门教程,如果各位小学生不懂如何进行BCS的基本操作,那么我们的大神门在度娘上已经留下了大量的痕迹,尽情地去Search(色)吧。

    假设,现在我们已经有了如下的其于BCS的字段叫“name”,如下图,它是从一个叫“dept stuff” 这个外部类型当中读取数据的,我们还勾选了的相关的 “部门、移动号码”,作为显示字段。

     

    重要概念

    要引用如下的3个DLL文件,

    我的using 是这样的:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.SharePoint;
    using System.Xml;
    using Microsoft.SharePoint.BusinessData;
    using Microsoft.SharePoint.Administration;
    using Microsoft.SharePoint.BusinessData.SharedService;
    using System.Data;
    using Microsoft.BusinessData.Runtime;
    using Microsoft.BusinessData.MetadataModel;
    using Microsoft.BusinessData.MetadataModel.Collections;
    using System.Web;
    using Microsoft.SharePoint.BusinessData.Infrastructure;
    using System.Globalization;
    

     

    1. 存了什么:Identity

    其实就是数据库中作为“标识”和“主键”的那一列,在创建SharePoint的Entity(即实体)时,一定要把这个Identity选出来,这是后面进行编程的基础,如果不设定这个的话,只能“呵呵”你了,因为我也不知道会发生什么。

    如下图,大家可以偷窥到,我们2个优秀的员工,包XX和蒋XX,所在的部门和移动号码,千万别认为你们所见的,就是在LIST所实际存储的,在External Data类型的字段中,除了Identity什么也不实际存储,那她们的“名字、部门、电话”,这些值是什么呢?

    缓存!Cache! (此处省略1000字原理),记住包括您建的这个叫name的栏,存储的也是Cache,所以当你天真的使用

    item["name"]="奥巴马"

    来赋值后,你会发现name:部门和name:移动号码,根本没有改变,不是因为我们没有员工叫 “奥巴马” ,而是Identity的问题,所以我们给这种类型字段赋新值,值并不重要,你必须要知道新值在数据库表中的Identity那列的值!

     

    2. 在哪存的:SPField.RelatedField

    那你要问了,这个Identity,既然不存储在所建的那个External Field里,那存储在哪里呢,YES! 就是在这个RelatedField里,在微软网站上,关于这个属性的说明,是如此简单和无节操,所以我们取Identity数据的时候要使用这样的语句,同样赋值也是:

     string entityId= listItem[dataField.RelatedField].ToString();
                            

     

    3. 怎么加密存的:EntityInstanceIdEncoder

    天哪,知道存了什么,存在哪里,读出来却是乱码一片,经过大神Dosboy的研究发现了,这个Identity,竟然是加密码保存的,用得就是这个加密的方法。这是要把人整死的节奏嘛?

    测试看看是不是加密:EntityInstanceIdEncoder.IsEncodedIdentifier

    用来解密:EntityInstanceIdEncoder.DecodeEntityInstanceId

    所以读取Identity的语句应该是这样子的:

     1                SPBusinessDataField dataField = listItem.Fields["name"] as SPBusinessDataField;
     2                         string entityId= listItem[dataField.RelatedField].ToString();
     3                         Identity id =null;
     4                         if (EntityInstanceIdEncoder.IsEncodedIdentifier(entityId))
     5                         {
     6                             object[] oIDList = EntityInstanceIdEncoder.DecodeEntityInstanceId(entityId);
     7                             id = new Identity(oIDList[0]);
     8 
     9 
    10                         }
    11                         else
    12                             id = new Identity(entityId);

    取出来的变量id,就是Identity类型的。如果要显示出来,就用这样的:

    Console.WriteLine(id.GetIdentifierValues()[0].ToString ());

    搞清楚外部数据External Data相关的存储的情况以后,我们就可以赋值的操作了

    给External Data栏赋值的过程

    1. 搞清楚你要赋的值在源数据库表中那个"主键"的栏的值是多少?

    有些人就说了,兄弟我只知道新值,比如本例叫“本.拉灯”,那怎么办,对不起,请在程序中编程查询ID的值,比如“本.拉灯”的员工号(一定很排前)。这是前提,否则不是违背了External Data的原本意义了嘛,就是通过让你选一行数据,然后显示数据库中的值。

     

    2. 给 RelatedField 赋 Identity的值,并根据Identity的值找到External Entity中的新值的那行:

     public static IEntityInstance GetEntityInstance(SPBusinessDataField dataField, string entityId, SPSite site, SPListItem item)
            {
    
               
                SPServiceContext context = SPServiceContext.GetContext(site);
                IMetadataCatalog catalog = null;
    
                BdcService bdcService = SPFarm.Local.Services.GetValue<BdcService>(String.Empty);
                if (null != bdcService)
                {
                    catalog = bdcService.GetDatabaseBackedMetadataCatalog(context);
                }
    
                IEntity entity = catalog.GetEntity(dataField.EntityNamespace, dataField.EntityName);
                ILobSystem lobSystem = entity.GetLobSystem();
                ILobSystemInstance LobSysteminstance = lobSystem.GetLobSystemInstances()[dataField.SystemInstanceName];
    
                IEntityInstance entInstance = null;
    
                // Get methods collection 
                foreach (KeyValuePair<string, IMethod> method in entity.GetMethods())
                {
                    // Get current method’s instance 
                    IMethodInstance methodInstance = method.Value.GetMethodInstances()[method.Key];
                    // Execute specific finder method. 
                    if (methodInstance.MethodInstanceType == MethodInstanceType.SpecificFinder)
                    {   
                        Identity id = null;
    
                        if (EntityInstanceIdEncoder.IsEncodedIdentifier(entityId))
                        {
                            object[] oIDList = EntityInstanceIdEncoder.DecodeEntityInstanceId(entityId);
                            id = new Identity(oIDList[0]);
    
                            // Execute specific finder method and get the entity instance 
                            entInstance = entity.FindSpecific(id, entity.GetLobSystem().GetLobSystemInstances()[0].Value);
                            item[dataField.RelatedField] = entityId.ToString();
                        }
                        else
                        {
                            object oID = GetTypedIDValue(entityId, entity);
                            id = new Identity(oID);
                            string encodedIdentifier = EntityInstanceIdEncoder.EncodeEntityInstanceId(new object[] { oID });
                            // Execute specific finder method and get the entity instance 
                           // Console.WriteLine(entity.Name + ":" + entity.GetLobSystem().GetLobSystemInstances()[0].Value.Name);
                            entInstance = entity.FindSpecific(id, entity.GetLobSystem().GetLobSystemInstances()[0].Value);
                            
                           
                            
                            item[dataField.RelatedField] = encodedIdentifier;
    
                        }
    
                    }
                }
    
                return entInstance;
            }
    
            public static object GetTypedIDValue(string sID, IEntity oEntity)
            {
                IIdentifierCollection type = oEntity.GetIdentifiers();
                String sIdentifierType = type[0].IdentifierType.FullName.ToLower().Replace("system.", String.Empty);
                object oID = null;
    
                //find the instance value based on the given identifier type
                switch (sIdentifierType)
                {
                    case "string":
                        oID = sID;
                        break;
                    case "datetime":
                        oID = DateTime.Parse(sID, CultureInfo.CurrentCulture);
                        break;
                    case "boolean":
                        oID = Boolean.Parse(sID);
                        break;
                    case "int64":
                        oID = Int64.Parse(sID);
                        break;
                    case "int32":
                        oID = Int32.Parse(sID);
                        break;
                    case "int16":
                        oID = Int16.Parse(sID);
                        break;
                    case "double":
                        oID = Double.Parse(sID);
                        break;
                    case "char":
                        oID = Char.Parse(sID);
                        break;
                    case "guid":
                        oID = new Guid(sID);
                        break;
                    default:
                        oID = sID;
                        break;
                }
                return oID;
            }

     

    以上的代码涉及很多关于BCS很多很多的概念,什么实例什么实体,我只想说,你就复制、粘贴吧,你唯一要搞清楚的就是2件事件:

    • 列表的Externl Data(就是外部类型)的栏的名字,还有你网站的URL是什么。
    • 新值,的Identity是什么。

     

    3. 给其它显示的栏 赋 显示的值

    第2步做完后,就要给其它栏,本例是名字(对的也属于其它栏)、手机、部门,赋显示的值哦,用这个代码:

     public static void SetSecondaryFields(SPListItem listItem, SPBusinessDataField dataField, IEntityInstance entityInstance)
            {
                // Convert the entity to a formatted datatable
                DataTable dtBDCData = entityInstance.EntityAsFormattedDataTable;
    
                // Set the BCS field itself (Display Value)
                listItem[dataField.Id] = dtBDCData.Rows[0][dataField.BdcFieldName].ToString();
    
                // Get the specific finder method to get the columns that returns
                IMethodInstance method = entityInstance.Entity.GetMethodInstances(MethodInstanceType.SpecificFinder)[0].Value;
                ITypeDescriptorCollection oDescriptors = method.GetReturnTypeDescriptor().GetChildTypeDescriptors()[0].GetChildTypeDescriptors();
    
                // Set the column names to the correct values
                foreach (ITypeDescriptor oType in oDescriptors)
                {
                    if (oType.ContainsLocalizedDisplayName())
                    {
                        if (dtBDCData.Columns.Contains(oType.Name))
                        {
                            dtBDCData.Columns[oType.Name].ColumnName = oType.GetLocalizedDisplayName();
                        }
                    }
                }
    
                // get the secondary field display names; these should be set
                string[] sSecondaryFieldsDisplayNames = dataField.GetSecondaryFieldsNames();
    
                // loop through the fields and set each column to its value
                foreach (string columnNameint in sSecondaryFieldsDisplayNames)
                {
                    Guid gFieldID = listItem.Fields[String.Format("{0}: {1}", dataField.Title, columnNameint)].Id;
                    listItem[gFieldID] = dtBDCData.Rows[0][columnNameint].ToString();
                }
    
                listItem.Update();
            }
          
        }

     

    以上还是涉及涉及很多概念,不用管,直接,复制、粘贴这个函数就行。

     

    4. 示例如何在命令行程序中使用如上的代码:

      把上面3个函数,把在一个静态的类中,我们叫myF,然后在Main函数中,写上如下的代码,这个代码是做这样的事情的.

    这个网站集的URL是: http://r720/sites/demo

    列表的名称是:External Field

    外部数据列叫:name (附带显示:部门、移动号码2列)

    我现在要把所有的行,的name栏都换成比刚才2位优秀员工更优秀的员工:本拉灯(他的代号200),代码如下,这个你不能复制粘贴,要换成自己的网站的情况:)

     using (SPSite spSite = new SPSite("http://r720/sites/demo"))
                {
                    using (SPWeb spWeb = spSite.RootWeb)
                    {
                        SPList list = spWeb.Lists["External Field"];
                        foreach (SPListItem  listItem  in list.Items)
                        {
                          
    
                            SPBusinessDataField dataField = listItem.Fields["name"] as SPBusinessDataField;
                        
                        IEntityInstance entityinst = myF.GetEntityInstance(dataField, "200",new SPSite("http://r720/sites/demo"), listItem);
                        myF.SetSecondaryFields(listItem, dataField, entityinst);
    
                       
    
                        }
                    }
                }
                Console.ReadLine();

     

    故事的核心就这么2个语句:

    IEntityInstance entityinst = GetEntityInstance(【外部字段】, 【新值ID】,【网站集】,【当前列表项】);
    SetSecondaryFields(【当前列表项】,【外部字段】,entityinst);

     

    我们再看看效果吧,(千万别打电话哦,有美国人监听呢:))

     

    展开全文
  • 1、新建一个任意类型的项目。安装Microsoft.Office.Interop.Excel,这种方式依赖于office,电脑上要装相应版本的office 我电脑上装了office专业版,MySql.Data不要选最新的, 2、引用程序集using Microsoft....

    我这里用com的方式去做,还有其他方法不再列举

    1、新建一个任意类型的项目。安装Microsoft.Office.Interop.Excel,这种方式依赖于office,电脑上要装相应版本的office
    这里写图片描述

    我电脑上装了office专业版,MySql.Data不要选最新的,

    2、引用程序集using Microsoft.Office.Interop.Excel;

    文件夹路径:写在配置文件里,容易改

        <add key="FilesPath" value="F:\HR-Link-Work\Pro\ProCommets\ProCommets\bin\ExcelFiles"/>

    遍历Excel文件夹,

       /// <summary>
            /// 获取文件夹下Excel文件,并打开操作
            /// </summary>
            /// <param name="filesPath">文件夹路径</param>
            public void GetExlFiles(string filesPath)
            {
                if (!Directory.Exists(filesPath))
                {
                    Directory.CreateDirectory(filesPath);
                }
                try
                {
                    DirectoryInfo directoryInfo = new DirectoryInfo(filesPath);
                    FileInfo[] files = directoryInfo.GetFiles();
                    //如果files存在,遍历
                    if (files.Length > 0)
                    {
                        foreach (var item in files)
                        {
                            //F:\HR-Link-Work\Pro\ProCommets\ProCommets\bin\ExcelFiles\tran_entity_logic_fields.xlsx
                            ReadExcel(item.FullName);
                        }
                    }
    
                    DirectoryInfo[] directoryInfoFolder = directoryInfo.GetDirectories();
                    //如果主文件夹下,还有文件夹,递归
                    if (directoryInfoFolder.Length > 0)
                    {
                        foreach (DirectoryInfo dir in directoryInfoFolder)
                        {
                            GetExlFiles(dir.FullName);
                        }
                    }
    
                }
                catch (Exception ex)
                {
    
                    throw ex;
                }
            }
            #endregion

    3、四个查询sql的方法

     #region Dal
            /// <summary>
            /// 查找表的comments
            /// </summary>
            /// <param name="tableName">表名</param>
            /// <returns></returns>
            public DataSet FindTableComment(string tableName)
            {
                try
                {
                    using (MySqlConnection con = new MySqlConnection(ConfigValue._conStr))
                    {
                        string sql = "select * from information_schema.TABLES WHERE `TABLE_NAME`='" + tableName + "'";
                        //string sql = "SELECT * FROM information_schema.TABLES WHERE `TABLE_NAME`=@tableName";
    
                        con.Open();
                        using (MySqlCommand cmd = new MySqlCommand(sql, con))
                        {
                            using (MySqlDataAdapter ad = new MySqlDataAdapter(sql, ConfigValue._conStr))
                            {
                                DataSet ds = new DataSet();
                                ad.Fill(ds);
                                return ds;
    
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            /// <summary>
            /// 查询表中每个字段的comment
            /// </summary>
            /// <param name="tableName">表名</param>
            /// <returns></returns>
            public DataSet FindTableFiledsComment(string tableName)
            {
                try
                {
                    using (MySqlConnection con = new MySqlConnection(ConfigValue._conStr))
                    {
                        string sql = "select * from information_schema.COLUMNS WHERE `TABLE_NAME`='" + tableName + "'";
    
                        con.Open();
                        using (MySqlCommand cmd = new MySqlCommand(sql, con))
                        {
                            using (MySqlDataAdapter ad = new MySqlDataAdapter(sql, ConfigValue._conStr))
                            {
                                DataSet ds = new DataSet();
                                ad.Fill(ds);
                                return ds;
    
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            /// <summary>
            /// 更新表的注释
            /// </summary>
            /// <param name="tableName">表名</param>
            /// <param name="comment">注释</param>
            /// <returns></returns>
            public int UpdateTableComment(string tableName, string comment)
            {
                try
                {
                    string sql = "alter table " + tableName + " comment  '" + comment + "'";
                    using (MySqlConnection con = new MySqlConnection(ConfigValue._conStr))
                    {
                        con.Open();
                        using (MySqlCommand cmd = new MySqlCommand(sql, con))
                        {
                            return cmd.ExecuteNonQuery();
    
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
    
            }
    
            /// <summary>
            /// 批量更新表字段的注释:alter table view_define_action modify column key_id int comment 'key_id'
            /// </summary>
            /// <param name="sqlList">一组修改字段注释的字符串</param>
            public void UpdateTableFieldsComment(List<string> sqlList)
            {
                try
                {
                    using (MySqlConnection con = new MySqlConnection(ConfigValue._conStr))
                    {
                        con.Open();
                        MySqlCommand cmd = new MySqlCommand();
                        cmd.Connection = con;
                        MySqlTransaction tx = con.BeginTransaction();
                        cmd.Transaction = tx;
                        try
                        {
                            for (int i = 0; i < sqlList.Count; i++)
                            {
                                string strsql = sqlList[i].ToString();
                                if (strsql.Trim().Length > 1)
                                {
                                    cmd.CommandText = strsql;
                                    cmd.ExecuteNonQuery();
                                }
                            }
                            tx.Commit();
                        }
                        catch (System.Data.SqlClient.SqlException ex)
                        {
    
                            tx.Rollback();
                            throw new Exception(ex.Message);
                        }
                        cmd.Dispose();
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
    
            #endregion

    4、替换表名注释

      /// <summary>
            /// 获取表的注释,有注释不操作,是空的话就更新
            /// </summary>
            /// <param name="tableName">表名</param>
            /// <param name="txt">表注释</param>
            public void GetTableCommentsUpdate(string tableName, string txt)
            {
                DataSet ds = FindTableComment(tableName);
                if (ds == null || ds.Tables[0].Rows == null || ds.Tables[0].Rows.Count == 0)
                    return;
                //表名
                string TABLE_NAME = ds.Tables[0].Rows[0]["TABLE_NAME"].ToString().Trim();
                //表注释
                string TABLE_COMMENT = ds.Tables[0].Rows[0]["TABLE_COMMENT"].ToString().Trim();
                //注释为空
                if (string.IsNullOrEmpty(TABLE_COMMENT))
                {
                    UpdateTableComment(tableName, txt);
                }
            }

    5、生成一个表中需要更新注释的一组sql语句

      /// <summary>
            /// 生成修改每个字段的sql语句
            /// </summary>
            /// <param name="tableName">表名</param>
            /// <param name="filed">字段</param>
            /// <param name="comment">注释</param>
            /// <returns></returns>
            public string GetFielsSql(string tableName, string filed, string comment)
            {
                try
                {
                    string sql = string.Empty;
                    //传入的注释为空,返回空
                    if (string.IsNullOrEmpty(comment))
                        return string.Empty;
                    //获取tableName的所有字段及注释
                    DataSet ds = FindTableFiledsComment(tableName);
                    foreach (DataRow i in ds.Tables[0].Rows)
                    {
                        //1.判断数据库表列名是否为空 2.表中的列名=Excel中的列名。
                        if (!string.IsNullOrEmpty(i["COLUMN_NAME"].ToString()) && filed == i["COLUMN_NAME"].ToString())
                        {
                            string tableCom = i["COLUMN_COMMENT"].ToString().Trim();
                            //如果字段中注释为空
                            if (string.IsNullOrEmpty(tableCom))
                            {
                                sql = " alter table " + tableName + " modify column  " + filed + " int comment  '" + comment + "'";
                                return sql;
                            }
                        }
                    }
    
                    return string.Empty;
                }
                catch (Exception ex)
                {
    
                    throw ex;
                }
            }

    6、打开Excel操作

     /// <summary>
            /// 打开Excel执行相关操作,
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public string ReadExcel(string filePath)
            {
                Application app = null;
                Workbooks wbks = null;
                try
                {
                    app = new Application();
                    wbks = app.Workbooks;
                    _Workbook _wbk = wbks.Add(filePath);
                    Sheets shs = _wbk.Sheets;
    
                    //获取第一个sheet
                    _Worksheet _wsh = shs.Item[1];
                    if (_wsh == null) return null;
                    string sheetName = _wsh.Name;
                    //sheet[1]的行总数
                    int rowsCount = _wsh.UsedRange.Rows.Count;
                    //sheet[1]的列总数
                    int ColumsCount = _wsh.UsedRange.Columns.Count;
    
                    Range range = (Range)_wsh.Cells[1, 1];
                    //sheet[1]的第一个单元格中的文本,作为表的注释
                    string txt = range.Text;
    
                    //更新表的注释
                    GetTableCommentsUpdate(sheetName, txt);
    
                    string rangeCellStart = string.Empty;
                    string rangeCellEnd = string.Empty;
                    List<string> sqlList = new List<string>();
                    //从第三行开始读取数据,第一行为表的注释,第二行为列名
                    for (int row = 3; row <= rowsCount; row++)
                    {
                        //字段名
                        rangeCellStart = ((Range)_wsh.Cells[row, 1]).Text;
                        //字段注释
                        rangeCellEnd = ((Range)_wsh.Cells[row, ColumsCount]).Text;
                        //1.字段名为空,中断循环。2.字段名中含有‘注’字的,中断循环
                        if (string.IsNullOrEmpty(rangeCellStart) || rangeCellStart.Contains("注"))
                        {
                            break;
                        }
                        //调用函数,为没有注释的字段,更新注释,sheetName作为表名
                        string sql = GetFielsSql(sheetName, rangeCellStart, rangeCellEnd);
                        //判断返回的sql语句是否有误
                        if (!string.IsNullOrEmpty(sql))
                        {
                            sqlList.Add(sql);
                        }
                    }
    
                    //更新表字段注释
                    UpdateTableFieldsComment(sqlList);
    
                    wbks.Close();              
                    app.Quit();
                    return null;
    
                }
                catch (Exception ex)
                {
                    wbks.Close();
                    app.Quit();
                    throw ex;
                }
            }
    展开全文
  • 字段叫什么名字、被定义为什么数据类型,需要引用常量池的常量来描述。 被引用的常量池对应的项,描述了字段的标识符、访问修饰符、是类变量还是实例变量、是否是常量。 注意: a). 字段表集合不会列出从父类...

    1.字段(fields)表集合

    1. 用于描述类或者接口中声明的变量。需要注意的是,字段(field)只包括类变量和实例变量,不包括方法内部、代码块内部声明的变量。
    2. 字段叫什么名字、被定义为什么数据类型,需要引用常量池中的常量来描述。
    3. 被引用的常量池表对应的项,描述了字段的标识符、访问修饰符、是类变量还是实例变量、是否是常量。
      注意:
      a). 字段表集合中不会列出从父类或者实现的接口中继承来的字段。
      b). Java中不可能存在两个同名的字段。但是,在字节码中,只要字段的描述符(用于描述数据类型)不一致,那字段重名就是合法的。
      在这里插入图片描述
      字段表集合分为两部分:字段计数器和字段表。

    1.1 字段计数器

    a)字段计数器(fileds_count)。字段计数器占两个字节。表示当前Class文件fields表的成员个数(也就是当前Class总共有多少个成员变量和静态变量)。
    在这里插入图片描述

    1.2 字段表集合

    字段表中每一个成员都是一个field_info结构,用于描述某一个对应的字段。field_info又有它自己的表结构。如下图中的表格所示,每一个field_info包含访问标志、字段名索引等5个部分。
    在这里插入图片描述

    1.2.1 访问标识

    用一个标志来描述字段的修饰符,例如publicstaticfinal等。
    在这里插入图片描述

    1.2.2 字段名索引

    指向常量池中的某项,用于描述字段的名字(查询常量池中指定项就可以得到)

    1.2.3 描述符索引

    用于描述字段的数据类型。
    在这里插入图片描述

    1.2.4 属性计数器和属性表集合

    一个字段还可能拥有一些属性,用于存储更多的信息。比如初始化值,一些注释信息等。属性的个数存放在属性计数器中,属性内容存在属性表集合中。
    例如:对于一个final修饰的常量,就会有图中蓝色部分所示的属性表集合。
    在这里插入图片描述

    2.方法表集合

    1. 用于描述类或者接口中的方法。方法表只描述当前类或接口中的方法,对于父类或父接口的方法不会进行描述。
    2. 字节码文件中,每一个method_info都对应着一个类或接口中的方法信息。
    3. Java方法重载的时候,无法仅仅依靠两个方法的返回值类型不一样来进行重载,也就是说定义两个方法,方法的名字和参数一样,但是方法的返回值类型不一样,是不允许的。但是在Class文件中,是允许多个方法的方法签名相同,但是要求这些方法的返回值类型不能相同。
      在这里插入图片描述
      方法表集合也分为两个部分:方法计数器和方法表集合。

    2.1 方法计数器

    用于描述当前Class文件中方法表的成员个数(也就是描述当前Class有多少个方法)。占两个字节。
    在这里插入图片描述

    2.2 方法表集合

    1. 方法表集合中每一个成员都是一个method_info结构。用于描述当前类或接口中的某个方法。
    2. method_info结构可以表示类和接口中的所有方法,包括实例方法、类方法、初始化方法等。
    3. 每一个method_info的结构和字段表的field_info结构是一样的,也包括访问标志、方法名索引等5个部分。
      在这里插入图片描述

    2.2.1 访问标志

    用于描述方法的修饰符。具体的访问标志如下图所示。
    在这里插入图片描述

    2.2.2 方法名索引

    指向常量池中的某项。用于描述方法的名字。

    2.2.3 描述符索引

    指向常量池中的某项。用于描述方法的参数和返回值类型。例如() I表示的是没有参数,返回值类型为int的一个方法。

    2.2.4 属性计数器和属性表集合

    一个方法也可能存在一些属性,用于存储一些而外的信息,例如字节码指令等。

    3.属性表集合

    1. 字段表、方法表都有自己的属性表集合(这一小节讲解的是方法表中的属性集合)。
      在这里插入图片描述
      属性表集合也分为两部分:属性计数器和属性表集合。

    3.1 属性计数器

    表示当前属性表中成员个数,每一项都是一个attribute_info结构。
    在这里插入图片描述

    3.2 属性表集合

    1. 属性表集合有着通用的格式,如下表所示。包括属性名索引、属性长度以及属性表。也就是说只需说明属性名以及占用的长度即可,属性表的内容可以自己去定义。
      在这里插入图片描述
    2. 属性表中的内容可以是多种属性类型,例如Java8中就有23种属性类型。如下图所示,这里列出了几种属性类型。
      在这里插入图片描述
      在这里插入图片描述

    3.2.1 方法属性表中的Code属性解读

    1. Code属性就是存放方法体里面的代码。但是,并非所有方法表都有Code属性。像接口或者抽象方法,他们没有具体的方法体,因此也就不会有Code属性了。
    2. Code属性的结构如下所示:
      在这里插入图片描述

    3.2.1.1 Code属性中的LineNumberTable属性

    1. LineNumberTable属性位于Code属性的属性表中。
    2. 用于描述Java源代码行号和字节码行号之间的对应关系。
      在这里插入图片描述

    3.2.1.2 Code属性中的LocalVariableTable属性

    1. LocalVariableTable属性位于Code属性的属性表中。
    2. 用于确定方法在执行过程中局部变量的信息。
      在这里插入图片描述

    4.SourceFile属性(了解)

    1. 在方法表集合之后,用于描述Class文件所携带的一些辅助信息,例如,该Class文件的名称等(无须深入了解)。
      在这里插入图片描述

    更多JVM文章请访问我的JVM专栏:
    https://blog.csdn.net/u011069294/category_10113093.html

    展开全文
  • 7--java数据类型

    2021-02-05 00:20:15
    Java的数据类型可以划分为基本数据类型引用数据类型两种: 基本数据类型浏览 注意以下内容用到了变量的知识,如果需要请看先看下一小节 整数类型:byte、short、int、long Java各整数类型有固定的数范围和...
  • 数据元素:相当于定义在数据字典的abap基本类型引用类型。 结构:由数据元素字段构成。 表类型:用于定义程序的结构和属性等。 转载于:https://www.cnblogs.com/zxiu/p/7389995.html...
  • 仔细检查后发现是该表中字段数据类型出了问题,即我们在引用变量时候与表中该字段的类型不一致导致的; 如果表中的该字段是文本,而我们代码里面引用的变量却是数字型用法" & 变量 (注:字...
  • 引用类型、复合类型

    2018-10-05 05:52:25
    --引用类型 --%type  --定义某个变量的数据类型与已存在的变量数据类型,某个列的数据类型相同。... --定义v_empno的类型跟emp表中的empno字段类型一致  v_ename emp.ename%type;  begin  select em...
  • JIRA更改自定义字段类型

    千次阅读 2009-09-14 18:00:00
    今天遇到JIRA搜索自定义字段(TextFiled类型的数字(如搜索:20090828999:定时定额设置(历史问题) ),结果发现查找不到数据。 查找发现应该是JIRA引用confluenced的问题,为了及时解决项目组的问题,...
  • 为了传入数据类型的变量(比如接受C#的DataTable类型变量),需要定义“用户自定义表类型”,通过“用户自定义表类型”可以接收二维数据集作为参数,在需要修改“用户自定义表类型”的时候,增加字段,删除字段...
  • odoo8新旧API related字段类型详解

    千次阅读 2016-04-05 17:31:40
    1.related 顾名思义“引用”,那么如何又是...该实例中user_id字段是本表中字段与res.user模型关联,改实例直接将该user_id关联的User表数据中的 name字段值应用到本模型中,改字段不存放到数据库 2.旧API实例: 'invo
  • 有个文章里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等 现在有篇文章他既是 头条,又是热点,还是图文, type以 1,3,4的格式存储. 们我们如何用sql查找所有type有...
  •  当建立好抽象数据类型的时候,数据库管理员就可以向基本数据类型那样,引用抽象数据类型,包括在建立或者对相关字段进行赋值的时候,都这么方便。 如在建立的时候,可以把这个抽象数据类型直接跟某个字段关联...
  • 2.域完整性:域完整性约束列(字段),规定表中字段数据格式正确 3.引用完整性:引用完整性约束表与表之间的关系,不能存在表与表外的数据 4.自定义完整性:自定义完整性用来约束用户自定义触发器的约束 二:...
  • 正如你所看到的,链表的每个元素实际上是一个单独的对象,而所有对象都通过每个元素引用字段链接在一起 链表有两种类型:单链表和双链表。上面给出的例子是一个单链表,这里有一个双链表的例子: 167. ...
  • C#读取oracle的number字段类型

    千次阅读 2013-02-06 15:27:33
    C#读取Oracle数据有2种方式,一种用.netframework自带的System.Data.OracleClient,一种用Oracle的驱动Oracle....先在oracle数据库创建test create table test ( topen number(9,4) ) 插入2条记录: insert
  • 数据结构之链表剖析

    2021-02-23 13:41:15
    链表是一种线性数据结构,其中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素引用字段链接在一起。 链表有两种类型:单链表和双链表 单链表 双链表 线性数据结构动态数组、栈(数组实现)、...
  • 1、先插入其它字段,BLOB字段初始化的时候,先初始化一个EMPTY_BLOB(),相当于一个BLOB对象的空壳,内部啥也没有,但是是一个对象。 2、SELECT <...3、如果在程序就直接得到一个BLOB对象的引用(相...
  • 1、基本数据类型 ...例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 2) 语法示例 struct() a、创建 hive (default)> create table stu...
  • 遇到往ORACLE数据库中插入数据时总是报ORA-01084 invalid argument in OCI call错误,经分析是因为表中的一个字段类型为CLOB,并且可为空,当在给该字段插入空值时引发的该错误。后来判断是否为空值,如果为空值使用...
  • 值类型和引用类型的区别: 似乎“值类型和引用类型的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第... C#基本数据类型是值类型,结构也是值类型。而数组、类、接口、字符串都是引用类型。
  • 3快速去除行字段中的空白数据项.xls4.1.9设置错误值的显示方式.xls4.1.10在数据透视表中自定义单元格格式.xls4.2.1利用条件格式突出显示数据.xls4.2.2为数据透视表添加永恒的表格线.xls4.3.1统计各班级各科...
  • 1、在查询语句中引用变量的值,加{ }符号是没有错的吧? 2、实在不懂,为何修改choose字段可以,而eachscore字段总是提示不存在?这两个字段都是int类型的。update以后的如下: ![图片说明]...
  • 1.PowerDesigner设置数据库2.设置数据库的自增属性 3....3、若引用另外一张,最好不要有冗余的字段。4、ip使用long型存储。5、要定义好数据库的默认值和默认长度。6、备注这种类型的使用varchar

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 817
精华内容 326
关键字:

引用表中字段数据类型