docs(driver):update C# 3.0 CN reference and example code (#15770)
* docs(driver):update C# 3.0 CN reference and example code * docs(driver):C# 3.0 CN reference fix with comment * docs(driver):C# 3.0 CN reference update with comment
This commit is contained in:
parent
9ac221a660
commit
66418d6414
|
@ -1,4 +1,7 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using TDengineDriver;
|
using TDengineDriver;
|
||||||
|
using TDengineDriver.Impl;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace TDengineExample
|
namespace TDengineExample
|
||||||
|
@ -19,8 +22,8 @@ namespace TDengineExample
|
||||||
{
|
{
|
||||||
if (code == 0 && taosRes != IntPtr.Zero)
|
if (code == 0 && taosRes != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
FetchRowAsyncCallback fetchRowAsyncCallback = new FetchRowAsyncCallback(FetchRowCallback);
|
FetchRawBlockAsyncCallback fetchRowAsyncCallback = new FetchRawBlockAsyncCallback(FetchRawBlockCallback);
|
||||||
TDengine.FetchRowAsync(taosRes, fetchRowAsyncCallback, param);
|
TDengine.FetchRawBlockAsync(taosRes, fetchRowAsyncCallback, param);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -28,179 +31,44 @@ namespace TDengineExample
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FetchRowCallback(IntPtr param, IntPtr taosRes, int numOfRows)
|
// Iteratively call this interface until "numOfRows" is no greater than 0.
|
||||||
|
static void FetchRawBlockCallback(IntPtr param, IntPtr taosRes, int numOfRows)
|
||||||
{
|
{
|
||||||
if (numOfRows > 0)
|
if (numOfRows > 0)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"{numOfRows} rows async retrieved");
|
Console.WriteLine($"{numOfRows} rows async retrieved");
|
||||||
DisplayRes(taosRes);
|
IntPtr pdata = TDengine.GetRawBlock(taosRes);
|
||||||
TDengine.FetchRowAsync(taosRes, FetchRowCallback, param);
|
List<TDengineMeta> metaList = TDengine.FetchFields(taosRes);
|
||||||
|
List<object> dataList = LibTaos.ReadRawBlock(pdata, metaList, numOfRows);
|
||||||
|
|
||||||
|
for (int i = 0; i < dataList.Count; i++)
|
||||||
|
{
|
||||||
|
if (i != 0 && (i+1) % metaList.Count == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("{0}\t|", dataList[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.Write("{0}\t|", dataList[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Console.WriteLine("");
|
||||||
|
TDengine.FetchRawBlockAsync(taosRes, FetchRawBlockCallback, param);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (numOfRows == 0)
|
if (numOfRows == 0)
|
||||||
{
|
{
|
||||||
Console.WriteLine("async retrieve complete.");
|
Console.WriteLine("async retrieve complete.");
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Console.WriteLine($"FetchRowAsync callback error, error code {numOfRows}");
|
Console.WriteLine($"FetchRawBlockCallback callback error, error code {numOfRows}");
|
||||||
}
|
}
|
||||||
TDengine.FreeResult(taosRes);
|
TDengine.FreeResult(taosRes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisplayRes(IntPtr res)
|
|
||||||
{
|
|
||||||
if (!IsValidResult(res))
|
|
||||||
{
|
|
||||||
TDengine.Cleanup();
|
|
||||||
System.Environment.Exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<TDengineMeta> metaList = TDengine.FetchFields(res);
|
|
||||||
int fieldCount = metaList.Count;
|
|
||||||
// metaList.ForEach((item) => { Console.Write("{0} ({1}) \t|\t", item.name, item.size); });
|
|
||||||
|
|
||||||
List<object> dataList = QueryRes(res, metaList);
|
|
||||||
for (int index = 0; index < dataList.Count; index++)
|
|
||||||
{
|
|
||||||
if (index % fieldCount == 0 && index != 0)
|
|
||||||
{
|
|
||||||
Console.WriteLine("");
|
|
||||||
}
|
|
||||||
Console.Write("{0} \t|\t", dataList[index].ToString());
|
|
||||||
|
|
||||||
}
|
|
||||||
Console.WriteLine("");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool IsValidResult(IntPtr res)
|
|
||||||
{
|
|
||||||
if ((res == IntPtr.Zero) || (TDengine.ErrorNo(res) != 0))
|
|
||||||
{
|
|
||||||
if (res != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
Console.Write("reason: " + TDengine.Error(res));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Console.WriteLine("");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<object> QueryRes(IntPtr res, List<TDengineMeta> meta)
|
|
||||||
{
|
|
||||||
IntPtr taosRow;
|
|
||||||
List<object> dataRaw = new();
|
|
||||||
while ((taosRow = TDengine.FetchRows(res)) != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
dataRaw.AddRange(FetchRow(taosRow, res));
|
|
||||||
}
|
|
||||||
if (TDengine.ErrorNo(res) != 0)
|
|
||||||
{
|
|
||||||
Console.Write("Query is not complete, Error {0} {1}", TDengine.ErrorNo(res), TDengine.Error(res));
|
|
||||||
}
|
|
||||||
TDengine.FreeResult(res);
|
|
||||||
Console.WriteLine("");
|
|
||||||
return dataRaw;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<object> FetchRow(IntPtr taosRow, IntPtr taosRes)//, List<TDengineMeta> metaList, int numOfFiled
|
|
||||||
{
|
|
||||||
List<TDengineMeta> metaList = TDengine.FetchFields(taosRes);
|
|
||||||
int numOfFiled = TDengine.FieldCount(taosRes);
|
|
||||||
|
|
||||||
|
|
||||||
List<object> dataRaw = new();
|
|
||||||
|
|
||||||
IntPtr colLengthPrt = TDengine.FetchLengths(taosRes);
|
|
||||||
int[] colLengthArr = new int[numOfFiled];
|
|
||||||
Marshal.Copy(colLengthPrt, colLengthArr, 0, numOfFiled);
|
|
||||||
|
|
||||||
for (int i = 0; i < numOfFiled; i++)
|
|
||||||
{
|
|
||||||
TDengineMeta meta = metaList[i];
|
|
||||||
IntPtr data = Marshal.ReadIntPtr(taosRow, IntPtr.Size * i);
|
|
||||||
|
|
||||||
if (data == IntPtr.Zero)
|
|
||||||
{
|
|
||||||
dataRaw.Add("NULL");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
switch ((TDengineDataType)meta.type)
|
|
||||||
{
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_BOOL:
|
|
||||||
bool v1 = Marshal.ReadByte(data) != 0;
|
|
||||||
dataRaw.Add(v1);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_TINYINT:
|
|
||||||
sbyte v2 = (sbyte)Marshal.ReadByte(data);
|
|
||||||
dataRaw.Add(v2);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
short v3 = Marshal.ReadInt16(data);
|
|
||||||
dataRaw.Add(v3);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_INT:
|
|
||||||
int v4 = Marshal.ReadInt32(data);
|
|
||||||
dataRaw.Add(v4);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_BIGINT:
|
|
||||||
long v5 = Marshal.ReadInt64(data);
|
|
||||||
dataRaw.Add(v5);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_FLOAT:
|
|
||||||
float v6 = (float)Marshal.PtrToStructure(data, typeof(float));
|
|
||||||
dataRaw.Add(v6);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_DOUBLE:
|
|
||||||
double v7 = (double)Marshal.PtrToStructure(data, typeof(double));
|
|
||||||
dataRaw.Add(v7);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_BINARY:
|
|
||||||
string v8 = Marshal.PtrToStringUTF8(data, colLengthArr[i]);
|
|
||||||
dataRaw.Add(v8);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_TIMESTAMP:
|
|
||||||
long v9 = Marshal.ReadInt64(data);
|
|
||||||
dataRaw.Add(v9);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_NCHAR:
|
|
||||||
string v10 = Marshal.PtrToStringUTF8(data, colLengthArr[i]);
|
|
||||||
dataRaw.Add(v10);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_UTINYINT:
|
|
||||||
byte v12 = Marshal.ReadByte(data);
|
|
||||||
dataRaw.Add(v12.ToString());
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_USMALLINT:
|
|
||||||
ushort v13 = (ushort)Marshal.ReadInt16(data);
|
|
||||||
dataRaw.Add(v13);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_UINT:
|
|
||||||
uint v14 = (uint)Marshal.ReadInt32(data);
|
|
||||||
dataRaw.Add(v14);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_UBIGINT:
|
|
||||||
ulong v15 = (ulong)Marshal.ReadInt64(data);
|
|
||||||
dataRaw.Add(v15);
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_JSONTAG:
|
|
||||||
string v16 = Marshal.PtrToStringUTF8(data, colLengthArr[i]);
|
|
||||||
dataRaw.Add(v16);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
dataRaw.Add("nonsupport data type");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return dataRaw;
|
|
||||||
}
|
|
||||||
|
|
||||||
static IntPtr GetConnection()
|
static IntPtr GetConnection()
|
||||||
{
|
{
|
||||||
string host = "localhost";
|
string host = "localhost";
|
||||||
|
@ -223,16 +91,16 @@ namespace TDengineExample
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//output:
|
// //output:
|
||||||
// Connect to TDengine success
|
// // Connect to TDengine success
|
||||||
// 8 rows async retrieved
|
// // 8 rows async retrieved
|
||||||
|
|
||||||
// 1538548685500 | 11.8 | 221 | 0.28 | california.losangeles | 2 |
|
// // 1538548685500 | 11.8 | 221 | 0.28 | california.losangeles | 2 |
|
||||||
// 1538548696600 | 13.4 | 223 | 0.29 | california.losangeles | 2 |
|
// // 1538548696600 | 13.4 | 223 | 0.29 | california.losangeles | 2 |
|
||||||
// 1538548685000 | 10.8 | 223 | 0.29 | california.losangeles | 3 |
|
// // 1538548685000 | 10.8 | 223 | 0.29 | california.losangeles | 3 |
|
||||||
// 1538548686500 | 11.5 | 221 | 0.35 | california.losangeles | 3 |
|
// // 1538548686500 | 11.5 | 221 | 0.35 | california.losangeles | 3 |
|
||||||
// 1538548685000 | 10.3 | 219 | 0.31 | california.sanfrancisco | 2 |
|
// // 1538548685000 | 10.3 | 219 | 0.31 | california.sanfrancisco | 2 |
|
||||||
// 1538548695000 | 12.6 | 218 | 0.33 | california.sanfrancisco | 2 |
|
// // 1538548695000 | 12.6 | 218 | 0.33 | california.sanfrancisco | 2 |
|
||||||
// 1538548696800 | 12.3 | 221 | 0.31 | california.sanfrancisco | 2 |
|
// // 1538548696800 | 12.3 | 221 | 0.31 | california.sanfrancisco | 2 |
|
||||||
// 1538548696650 | 10.3 | 218 | 0.25 | california.sanfrancisco | 3 |
|
// // 1538548696650 | 10.3 | 218 | 0.25 | california.sanfrancisco | 3 |
|
||||||
// async retrieve complete.
|
// // async retrieve complete.
|
|
@ -1,4 +1,5 @@
|
||||||
using TDengineDriver;
|
using TDengineDriver;
|
||||||
|
using TDengineDriver.Impl;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace TDengineExample
|
namespace TDengineExample
|
||||||
|
@ -23,7 +24,7 @@ namespace TDengineExample
|
||||||
Console.WriteLine("fieldCount=" + fieldCount);
|
Console.WriteLine("fieldCount=" + fieldCount);
|
||||||
|
|
||||||
// print column names
|
// print column names
|
||||||
List<TDengineMeta> metas = TDengine.FetchFields(res);
|
List<TDengineMeta> metas = LibTaos.GetMeta(res);
|
||||||
for (int i = 0; i < metas.Count; i++)
|
for (int i = 0; i < metas.Count; i++)
|
||||||
{
|
{
|
||||||
Console.Write(metas[i].name + "\t");
|
Console.Write(metas[i].name + "\t");
|
||||||
|
@ -31,98 +32,17 @@ namespace TDengineExample
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
|
|
||||||
// print values
|
// print values
|
||||||
IntPtr row;
|
List<Object> resData = LibTaos.GetData(res);
|
||||||
while ((row = TDengine.FetchRows(res)) != IntPtr.Zero)
|
for (int i = 0; i < resData.Count; i++)
|
||||||
{
|
{
|
||||||
List<TDengineMeta> metaList = TDengine.FetchFields(res);
|
Console.Write($"|{resData[i].ToString()} \t");
|
||||||
int numOfFiled = TDengine.FieldCount(res);
|
if (((i + 1) % metas.Count == 0))
|
||||||
|
|
||||||
List<String> dataRaw = new List<string>();
|
|
||||||
|
|
||||||
IntPtr colLengthPrt = TDengine.FetchLengths(res);
|
|
||||||
int[] colLengthArr = new int[numOfFiled];
|
|
||||||
Marshal.Copy(colLengthPrt, colLengthArr, 0, numOfFiled);
|
|
||||||
|
|
||||||
for (int i = 0; i < numOfFiled; i++)
|
|
||||||
{
|
{
|
||||||
TDengineMeta meta = metaList[i];
|
Console.WriteLine("");
|
||||||
IntPtr data = Marshal.ReadIntPtr(row, IntPtr.Size * i);
|
|
||||||
|
|
||||||
if (data == IntPtr.Zero)
|
|
||||||
{
|
|
||||||
Console.Write("NULL\t");
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
switch ((TDengineDataType)meta.type)
|
|
||||||
{
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_BOOL:
|
|
||||||
bool v1 = Marshal.ReadByte(data) == 0 ? false : true;
|
|
||||||
Console.Write(v1.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_TINYINT:
|
|
||||||
sbyte v2 = (sbyte)Marshal.ReadByte(data);
|
|
||||||
Console.Write(v2.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
short v3 = Marshal.ReadInt16(data);
|
|
||||||
Console.Write(v3.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_INT:
|
|
||||||
int v4 = Marshal.ReadInt32(data);
|
|
||||||
Console.Write(v4.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_BIGINT:
|
|
||||||
long v5 = Marshal.ReadInt64(data);
|
|
||||||
Console.Write(v5.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_FLOAT:
|
|
||||||
float v6 = (float)Marshal.PtrToStructure(data, typeof(float));
|
|
||||||
Console.Write(v6.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_DOUBLE:
|
|
||||||
double v7 = (double)Marshal.PtrToStructure(data, typeof(double));
|
|
||||||
Console.Write(v7.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_BINARY:
|
|
||||||
string v8 = Marshal.PtrToStringUTF8(data, colLengthArr[i]);
|
|
||||||
Console.Write(v8 + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_TIMESTAMP:
|
|
||||||
long v9 = Marshal.ReadInt64(data);
|
|
||||||
Console.Write(v9.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_NCHAR:
|
|
||||||
string v10 = Marshal.PtrToStringUTF8(data, colLengthArr[i]);
|
|
||||||
Console.Write(v10 + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_UTINYINT:
|
|
||||||
byte v12 = Marshal.ReadByte(data);
|
|
||||||
Console.Write(v12.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_USMALLINT:
|
|
||||||
ushort v13 = (ushort)Marshal.ReadInt16(data);
|
|
||||||
Console.Write(v13.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_UINT:
|
|
||||||
uint v14 = (uint)Marshal.ReadInt32(data);
|
|
||||||
Console.Write(v14.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_UBIGINT:
|
|
||||||
ulong v15 = (ulong)Marshal.ReadInt64(data);
|
|
||||||
Console.Write(v15.ToString() + "\t");
|
|
||||||
break;
|
|
||||||
case TDengineDataType.TSDB_DATA_TYPE_JSONTAG:
|
|
||||||
string v16 = Marshal.PtrToStringUTF8(data, colLengthArr[i]);
|
|
||||||
Console.Write(v16 + "\t");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Console.Write("nonsupport data type value");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
}
|
|
||||||
if (TDengine.ErrorNo(res) != 0)
|
if (TDengine.ErrorNo(res) != 0)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Query is not complete, Error {TDengine.ErrorNo(res)} {TDengine.Error(res)}");
|
Console.WriteLine($"Query is not complete, Error {TDengine.ErrorNo(res)} {TDengine.Error(res)}");
|
||||||
|
|
|
@ -15,10 +15,10 @@ namespace TDengineExample
|
||||||
CheckRes(conn, res, "failed to change database");
|
CheckRes(conn, res, "failed to change database");
|
||||||
res = TDengine.Query(conn, "CREATE STABLE power.meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT)");
|
res = TDengine.Query(conn, "CREATE STABLE power.meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT)");
|
||||||
CheckRes(conn, res, "failed to create stable");
|
CheckRes(conn, res, "failed to create stable");
|
||||||
var sql = "INSERT INTO d1001 USING meters TAGS(California.SanFrancisco, 2) VALUES ('2018-10-03 14:38:05.000', 10.30000, 219, 0.31000) ('2018-10-03 14:38:15.000', 12.60000, 218, 0.33000) ('2018-10-03 14:38:16.800', 12.30000, 221, 0.31000) " +
|
var sql = "INSERT INTO d1001 USING meters TAGS('California.SanFrancisco', 2) VALUES ('2018-10-03 14:38:05.000', 10.30000, 219, 0.31000) ('2018-10-03 14:38:15.000', 12.60000, 218, 0.33000) ('2018-10-03 14:38:16.800', 12.30000, 221, 0.31000) " +
|
||||||
"d1002 USING power.meters TAGS(California.SanFrancisco, 3) VALUES('2018-10-03 14:38:16.650', 10.30000, 218, 0.25000) " +
|
"d1002 USING power.meters TAGS('California.SanFrancisco', 3) VALUES('2018-10-03 14:38:16.650', 10.30000, 218, 0.25000) " +
|
||||||
"d1003 USING power.meters TAGS(California.LosAngeles, 2) VALUES('2018-10-03 14:38:05.500', 11.80000, 221, 0.28000)('2018-10-03 14:38:16.600', 13.40000, 223, 0.29000) " +
|
"d1003 USING power.meters TAGS('California.LosAngeles', 2) VALUES('2018-10-03 14:38:05.500', 11.80000, 221, 0.28000)('2018-10-03 14:38:16.600', 13.40000, 223, 0.29000) " +
|
||||||
"d1004 USING power.meters TAGS(California.LosAngeles, 3) VALUES('2018-10-03 14:38:05.000', 10.80000, 223, 0.29000)('2018-10-03 14:38:06.500', 11.50000, 221, 0.35000)";
|
"d1004 USING power.meters TAGS('California.LosAngeles', 3) VALUES('2018-10-03 14:38:05.000', 10.80000, 223, 0.29000)('2018-10-03 14:38:06.500', 11.50000, 221, 0.35000)";
|
||||||
res = TDengine.Query(conn, sql);
|
res = TDengine.Query(conn, sql);
|
||||||
CheckRes(conn, res, "failed to insert data");
|
CheckRes(conn, res, "failed to insert data");
|
||||||
int affectedRows = TDengine.AffectRows(res);
|
int affectedRows = TDengine.AffectRows(res);
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace TDengineExample
|
||||||
CheckStmtRes(res, "failed to prepare stmt");
|
CheckStmtRes(res, "failed to prepare stmt");
|
||||||
|
|
||||||
// 2. bind table name and tags
|
// 2. bind table name and tags
|
||||||
TAOS_BIND[] tags = new TAOS_BIND[2] { TaosBind.BindBinary("California.SanFrancisco"), TaosBind.BindInt(2) };
|
TAOS_MULTI_BIND[] tags = new TAOS_MULTI_BIND[2] { TaosMultiBind.MultiBindBinary(new string[]{"California.SanFrancisco"}), TaosMultiBind.MultiBindInt(new int?[] {2}) };
|
||||||
res = TDengine.StmtSetTbnameTags(stmt, "d1001", tags);
|
res = TDengine.StmtSetTbnameTags(stmt, "d1001", tags);
|
||||||
CheckStmtRes(res, "failed to bind table name and tags");
|
CheckStmtRes(res, "failed to bind table name and tags");
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ namespace TDengineExample
|
||||||
CheckStmtRes(res, "faild to execute");
|
CheckStmtRes(res, "faild to execute");
|
||||||
|
|
||||||
// 6. free
|
// 6. free
|
||||||
TaosBind.FreeTaosBind(tags);
|
TaosMultiBind.FreeTaosBind(tags);
|
||||||
TaosMultiBind.FreeTaosBind(values);
|
TaosMultiBind.FreeTaosBind(values);
|
||||||
TDengine.Close(conn);
|
TDengine.Close(conn);
|
||||||
TDengine.Cleanup();
|
TDengine.Cleanup();
|
||||||
|
|
|
@ -1,12 +1,100 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using TDengineTMQ;
|
||||||
using System.Linq;
|
using TDengineDriver;
|
||||||
using System.Text;
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace csharp
|
namespace TMQExample
|
||||||
{
|
{
|
||||||
internal class SubscribeDemo
|
internal class SubscribeDemo
|
||||||
{
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
IntPtr conn = GetConnection();
|
||||||
|
string topic = "topic_example";
|
||||||
|
Console.WriteLine($"create topic if not exist {topic} as select * from meters");
|
||||||
|
//create topic
|
||||||
|
IntPtr res = TDengine.Query(conn, $"create topic if not exists {topic} as select * from meters");
|
||||||
|
|
||||||
|
if (res == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
throw new Exception($"create topic failed, reason:{TDengine.Error(res)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var cfg = new ConsumerConfig
|
||||||
|
{
|
||||||
|
GourpId = "group_1",
|
||||||
|
TDConnectUser = "root",
|
||||||
|
TDConnectPasswd = "taosdata",
|
||||||
|
MsgWithTableName = "true",
|
||||||
|
TDConnectIp = "127.0.0.1",
|
||||||
|
};
|
||||||
|
|
||||||
|
// create consumer
|
||||||
|
var consumer = new ConsumerBuilder(cfg)
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
// subscribe
|
||||||
|
consumer.Subscribe(topic);
|
||||||
|
|
||||||
|
// consume
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
var consumeRes = consumer.Consume(300);
|
||||||
|
// print consumeResult
|
||||||
|
foreach (KeyValuePair<TopicPartition, TaosResult> kv in consumeRes.Message)
|
||||||
|
{
|
||||||
|
Console.WriteLine("topic partitions:\n{0}", kv.Key.ToString());
|
||||||
|
|
||||||
|
kv.Value.Metas.ForEach(meta =>
|
||||||
|
{
|
||||||
|
Console.Write("{0} {1}({2}) \t|", meta.name, meta.TypeName(), meta.size);
|
||||||
|
});
|
||||||
|
Console.WriteLine("");
|
||||||
|
kv.Value.Datas.ForEach(data =>
|
||||||
|
{
|
||||||
|
Console.WriteLine(data.ToString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
consumer.Commit(consumeRes);
|
||||||
|
Console.WriteLine("\n================ {0} done ", i);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieve topic list
|
||||||
|
List<string> topics = consumer.Subscription();
|
||||||
|
topics.ForEach(t => Console.WriteLine("topic name:{0}", t));
|
||||||
|
|
||||||
|
|
||||||
|
// unsubscribe
|
||||||
|
consumer.Unsubscribe();
|
||||||
|
|
||||||
|
// close consumer after use.Otherwise will lead memory leak.
|
||||||
|
consumer.Close();
|
||||||
|
TDengine.Close(conn);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static IntPtr GetConnection()
|
||||||
|
{
|
||||||
|
string host = "localhost";
|
||||||
|
short port = 6030;
|
||||||
|
string username = "root";
|
||||||
|
string password = "taosdata";
|
||||||
|
string dbname = "power";
|
||||||
|
var conn = TDengine.Connect(host, username, password, dbname, port);
|
||||||
|
if (conn == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Connect to TDengine failed");
|
||||||
|
System.Environment.Exit(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Connect to TDengine success");
|
||||||
|
}
|
||||||
|
return conn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="TDengine.Connector" Version="1.0.6" />
|
<PackageReference Include="TDengine.Connector" Version="3.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="TDengine.Connector" Version="1.0.6" />
|
<PackageReference Include="TDengine.Connector" Version="3.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="TDengine.Connector" Version="1.0.6" />
|
<PackageReference Include="TDengine.Connector" Version="3.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="TDengine.Connector" Version="1.0.6" />
|
<PackageReference Include="TDengine.Connector" Version="3.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="TDengine.Connector" Version="1.0.6" />
|
<PackageReference Include="TDengine.Connector" Version="3.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="TDengine.Connector" Version="1.0.6" />
|
<PackageReference Include="TDengine.Connector" Version="3.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="TDengine.Connector" Version="1.0.6" />
|
<PackageReference Include="TDengine.Connector" Version="3.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="TDengine.Connector" Version="1.0.6" />
|
<PackageReference Include="TDengine.Connector" Version="3.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<StartupObject>TDengineExample.SubscribeDemo</StartupObject>
|
<StartupObject>TMQExample.SubscribeDemo</StartupObject>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="TDengine.Connector" Version="1.0.6" />
|
<PackageReference Include="TDengine.Connector" Version="3.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -22,7 +22,9 @@ import CSAsyncQuery from "../../07-develop/04-query-data/_cs_async.mdx"
|
||||||
|
|
||||||
本文介绍如何在 Linux 或 Windows 环境中安装 `TDengine.Connector`,并通过 `TDengine.Connector` 连接 TDengine 集群,进行数据写入、查询等基本操作。
|
本文介绍如何在 Linux 或 Windows 环境中安装 `TDengine.Connector`,并通过 `TDengine.Connector` 连接 TDengine 集群,进行数据写入、查询等基本操作。
|
||||||
|
|
||||||
`TDengine.Connector` 的源码托管在 [GitHub](https://github.com/taosdata/taos-connector-dotnet)。
|
注意:`TDengine.Connector` 3.x 不兼容 TDengine 2.x,如果在运行 TDengine 2.x 版本的环境下需要使用 C# 连接器请使用 TDengine.Connector 的 1.x 版本 。
|
||||||
|
|
||||||
|
`TDengine.Connector` 的源码托管在 [GitHub](https://github.com/taosdata/taos-connector-dotnet/tree/3.0)。
|
||||||
|
|
||||||
## 支持的平台
|
## 支持的平台
|
||||||
|
|
||||||
|
@ -63,15 +65,15 @@ dotnet add package TDengine.Connector
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem value="source" label="使用源码获取 C# 驱动">
|
<TabItem value="source" label="使用源码获取 C# 驱动">
|
||||||
|
|
||||||
可以下载 TDengine 的源码,直接引用最新版本的 TDengine.Connector 库
|
也可以[下载源码](https://github.com/taosdata/taos-connector-dotnet/tree/3.0),直接引用 TDengine.Connector 库
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/taosdata/TDengine.git
|
git clone -b 3.0 https://github.com/taosdata/taos-connector-dotnet.git
|
||||||
cd TDengine/src/connector/C#/src/
|
cd taos-connector-dotnet
|
||||||
cp -r TDengineDriver/ myProject
|
cp -r src/ myProject
|
||||||
|
|
||||||
cd myProject
|
cd myProject
|
||||||
dotnet add TDengineDriver/TDengineDriver.csproj
|
dotnet add exmaple.csproj reference src/TDengine.csproj
|
||||||
```
|
```
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
@ -145,20 +147,19 @@ namespace TDengineExample
|
||||||
|
|
||||||
|示例程序 | 示例程序描述 |
|
|示例程序 | 示例程序描述 |
|
||||||
|--------------------------------------------------------------------------------------------------------------------|--------------------------------------------|
|
|--------------------------------------------------------------------------------------------------------------------|--------------------------------------------|
|
||||||
| [C#checker](https://github.com/taosdata/TDengine/tree/develop/examples/C%23/C%23checker) | 使用 TDengine.Connector 可以通过 help 命令中提供的参数,测试C# Driver的同步写入和查询 |
|
| [CURD](https://github.com/taosdata/taos-connector-dotnet/blob/3.0/examples/Query/Query.cs) | 使用 TDengine.Connector 实现的建表、插入、查询示例 |
|
||||||
| [TDengineTest](https://github.com/taosdata/TDengine/tree/develop/examples/C%23/TDengineTest) | 使用 TDengine.Connector 实现的简单写入和查询的示例 |
|
| [JSON Tag](https://github.com/taosdata/taos-connector-dotnet/blob/3.0/examples/JSONTag) | 使用 TDengine.Connector 实现的写入和查询 JSON tag 类型数据的示例 |
|
||||||
| [insertCn](https://github.com/taosdata/TDengine/tree/develop/examples/C%23/insertCn) | 使用 TDengine.Connector 实现的写入和查询中文字符的示例 |
|
| [stmt](https://github.com/taosdata/taos-connector-dotnet/tree/3.0/examples/Stmt) | 使用 TDengine.Connector 实现的参数绑定插入和查询的示例 |
|
||||||
| [jsonTag](https://github.com/taosdata/TDengine/tree/develop/examples/C%23/jsonTag) | 使用 TDengine.Connector 实现的写入和查询 json tag 类型数据的示例 |
|
| [schemaless](https://github.com/taosdata/taos-connector-dotnet/blob/3.0/examples/schemaless) | 使用 TDengine.Connector 实现的使用 schemaless 写入的示例 |
|
||||||
| [stmt](https://github.com/taosdata/TDengine/tree/develop/examples/C%23/stmt) | 使用 TDengine.Connector 实现的参数绑定的示例 |
|
| [async query](https://github.com/taosdata/taos-connector-dotnet/blob/3.0/examples/AsyncQuery/QueryAsync.cs) | 使用 TDengine.Connector 实现的异步查询的示例 |
|
||||||
| [schemaless](https://github.com/taosdata/TDengine/tree/develop/examples/C%23/schemaless) | 使用 TDengine.Connector 实现的使用 schemaless 写入的示例 |
|
| [TMQ](https://github.com/taosdata/taos-connector-dotnet/blob/3.0/examples/TMQ/TMQ.cs) | 使用 TDengine.Connector 实现的订阅数据的示例 |
|
||||||
| [benchmark](https://github.com/taosdata/TDengine/tree/develop/examples/C%23/taosdemo) | 使用 TDengine.Connector 实现的简易 Benchmark |
|
|
||||||
| [async query](https://github.com/taosdata/taos-connector-dotnet/blob/develop/examples/QueryAsyncSample.cs) | 使用 TDengine.Connector 实现的异步查询的示例 |
|
|
||||||
| [subscribe](https://github.com/taosdata/taos-connector-dotnet/blob/develop/examples/SubscribeSample.cs) | 使用 TDengine.Connector 实现的订阅数据的示例 |
|
|
||||||
|
|
||||||
## 重要更新记录
|
## 重要更新记录
|
||||||
|
|
||||||
| TDengine.Connector | 说明 |
|
| TDengine.Connector | 说明 |
|
||||||
|--------------------|--------------------------------|
|
|--------------------|--------------------------------|
|
||||||
|
| 3.0.0 | 支持 TDengine 3.0.0.0,不兼容 2.x。新增接口TDengine.Impl.GetData(),解析查询结果。 |
|
||||||
|
| 1.0.7 | 修复 TDengine.Query()内存泄露。 |
|
||||||
| 1.0.6 | 修复 schemaless 在 1.0.4 和 1.0.5 中失效 bug。 |
|
| 1.0.6 | 修复 schemaless 在 1.0.4 和 1.0.5 中失效 bug。 |
|
||||||
| 1.0.5 | 修复 Windows 同步查询中文报错 bug。 |
|
| 1.0.5 | 修复 Windows 同步查询中文报错 bug。 |
|
||||||
| 1.0.4 | 新增异步查询,订阅等功能。修复绑定参数 bug。 |
|
| 1.0.4 | 新增异步查询,订阅等功能。修复绑定参数 bug。 |
|
||||||
|
|
Loading…
Reference in New Issue