zoukankan      html  css  js  c++  java
  • 从钱龙数据中读取股票代码信息导入到数据库

    写股票相关的程序最苦恼的事莫过于没有数据了, 于是参考了网上其他朋友的一些文章,写了一个程序,可以把钱龙里的一些数据导入到数据库,以便进一步使用.

    在我的例子里使用的是MS SqlServer 2005, 如果要使用其他数据库,可能某些地方要做一定的修改.

    钱龙软件的股票代码按照市场不同保存在两个文件: stockinfo.sha和stockinfo.szn, 分别代表上海和深圳.

    下面是我的程序的核心代码:
            private static void ReadStockCodes(string strPath, string p_strMarket)
            
    {
                FileStream stream 
    = new FileStream(strPath, FileMode.Open, FileAccess.Read);
                BinaryReader b_reader 
    = new BinaryReader(stream);
                SqlCommand cmd 
    = new SqlCommand("", m_conn);
                cmd.Transaction 
    = m_tran;
                cmd.CommandText 
    = "insert into stockinfos ([StockCode] ,[Market] ,[StockName], [IsIndex]) " +
                    
    "VALUES (@StockCode,@Market,@StockName, @IsIndex)";
                cmd.Parameters.Add(
    "@StockCode", SqlDbType.NChar, 6);
                cmd.Parameters.Add(
    "@Market", SqlDbType.NVarChar, 10);
                cmd.Parameters.Add(
    "@StockName", SqlDbType.NVarChar, 20);
                cmd.Parameters.Add(
    "@IsIndex", SqlDbType.Bit);
                
    try
                
    {
                    
    while (stream.CanRead)
                    
    {
                        
    int nIndex = b_reader.ReadInt32();
                        
    string strCode = GetString(b_reader, 7);
                        
    int nCnt = 0;
                        List
    <Byte> endbytes = new List<byte>();
                        endbytes.Add(
    0);
                        
    string strName = GetStringTillEnd(b_reader,endbytes, out nCnt);
                        strCode 
    = strCode.Replace('\0'' ');
                        strName 
    = strName.Replace('\0'' ');
                        strCode 
    = strCode.Trim();
                        strName 
    = strName.Trim();
                        
    int n = 0x119;
                        n 
    -= 4 + 7;
                        n 
    -= nCnt;
                        cmd.Parameters[
    0].Value = strCode;
                        cmd.Parameters[
    1].Value = p_strMarket;
                        cmd.Parameters[
    2].Value = strName;
                        
    int nIsIndex=0;
                        
                        
    if ((p_strMarket == "SH" && ( strCode.StartsWith("000"|| strCode.StartsWith("801"))
                            
    || 
                            (p_strMarket 
    == "SZ" && ( strCode.StartsWith("399")))
                            
    ||
                            strName.Contains(
    "指数")))
                        
    {
                            nIsIndex 
    = 1;
                        }

                        cmd.Parameters[
    3].Value = nIsIndex;
                        cmd.ExecuteNonQuery();
                        Console.WriteLine(
    "Index={0}, Code={1}, Name={2}, {3}", nIndex, strCode, strName, 
                            nIsIndex
    ==1 ? "指数" : "证券");
                        b_reader.ReadBytes(n);
                    }

                }

                
    catch (EndOfStreamException)
                
    {
                }

                
    catch (Exception ex)
                
    {

                    Console.WriteLine(ex.Message);
                    
    throw;
                }

            }

    其中用到的两个读入字符串的方法为:
            public static string GetString(BinaryReader m_reader, int p_nLength)
            
    {
                Encoding mbcs 
    = Encoding.GetEncoding(936);
                Encoding unicode 
    = Encoding.Unicode;

                
    byte[] byteBuffer = m_reader.ReadBytes(p_nLength);
                
    byte[] unicodBytes = Encoding.Convert(mbcs, unicode, byteBuffer);
                
    char[] buffer;// = new char[unicode.GetCharCount(unicodBytes)];
                buffer = unicode.GetChars(unicodBytes);
                
    // char[] buffer = m_reader.ReadChars(p_nLength);
                string str = new string(buffer);
                str 
    = str.Replace('\x3''\x20');
                
    return str.Trim();
            }

            
    public static string GetStringTillEnd(BinaryReader m_reader, List<byte> p_endchars, out int p_nLength)
            
    {
                Encoding mbcs 
    = Encoding.GetEncoding(936);
                Encoding unicode 
    = Encoding.Unicode;
                p_nLength 
    = 0;
                
    byte[] byteBuffer_0 = new byte[1024];
                
    byte b;
                
    do
                
    {
                    b 
    = m_reader.ReadByte();
                    p_nLength
    ++;
                    byteBuffer_0[p_nLength 
    - 1= b;
                }

                
    while (!p_endchars.Contains(b));

                
    //byteBuffer = m_reader.ReadBytes(p_nLength);
                byte[] byteBuffer= new byte[p_nLength];
                
    for (int i = 0; i < p_nLength; i++) byteBuffer[i] = byteBuffer_0[i];

                
    byte[] unicodBytes = Encoding.Convert(mbcs, unicode, byteBuffer);
                
    char[] buffer;// = new char[unicode.GetCharCount(unicodBytes)];
                buffer = unicode.GetChars(unicodBytes);
                
    // char[] buffer = m_reader.ReadChars(p_nLength);
                string str = new string(buffer);
                str 
    = str.Replace('\x3''\x20');
                
    return str.Trim();
            }


    因为程序很简单, 其他不重要的部分我就不放上来了.
  • 相关阅读:
    mysql分表场景分析与简单分表操作
    Linux内嵌汇编
    window 和 linux x64差别
    sourcetree和gitlab配置图解
    QT如何管理组件(解决“要继续此操作,至少需要一个有效且已启用的储存库”问题)
    QT5.x应用在Mac OS X和Windows平台的发布过程
    python中读写二进制文件
    mysql分表的3种方法
    MySQL-C++封装类
    MySQL删除数据库时无响应解决办法
  • 原文地址:https://www.cnblogs.com/sliencer/p/688605.html
Copyright © 2011-2022 走看看